컴공 일기200
게시글 주소: https://orbi.kr/00059195297

200번째의 글로 치닫고 있습니다. 과제하랴, 개인 공부하랴, 수업 들으랴, 대학 생활하랴, 너무 정신이 없었던 최근이었네요. 개인적으로, 몸은 많이 힘들고 지치긴 합니다만, 좋아하는 공부와 일상을 건축해나가고 있는 듯해서 뿌듯한 것도 사실입니다.
수험생, 그 사람들 만큼은 아니겠지만 대학생으로서 숨 쉬는 나도 '젊음'이라는 관념을 놓치고 싶지 않았습니다. 그런 고상한 정신 때문이었을까. 종종, 과분하게도 주변 사람들은 나를 호되게 칭찬하면서, 어떻게 그렇게 열심히 할 수 있냐고 묻더군요. 그런데, 사실 이 의지의 발현이 가능했던 것은 내가 다른 사람들에 비해 우수한 측면(말하자면 재능)을 갖고 있었기 때문은 아닙니다.
어떤, 대단한 수치적 목표가 있는 것은 아니거든요. 연봉 2억 어치 개발자가 되겠다고, 창업을 해서 시가 총액 몇 순위 안에 드는 리더가 되겠다고, 그런 거창한 꿈을 갖고 사는 삶의 형태가 아닙니다. 다만, 공학 공부를 하는 내내 호기심을 가지고, 주어진 예제를 푸는 것이 굉장히 재미있을 뿐입니다. 말하자면, "순수성"에 입각한 일상의 의지, 그 이상 그 이하도 아니라는 것.
4수의 경험 끝에 내가 얻은 것 중 하나는, 우리네 인생에서 "수치"가 말해줄 수 있는 것은 생각보다 미미하다는 점입니다. 점수와 학벌에 입각한 레테르 조각들 가지고 그 사람의 수준과 배경을 판단하곤 하지만, 기실 그것은 참고 사항일 뿐, 그 자체의 존재를 논증할 수 있을 만큼 정확하지 않다는 것. 그러기에 존재의 이력서는 숫자가 아니라 그 사람의 냄새, 소리, 분위기, 감정, 어조 등 보이지 않는 영역에 있음을 잊지 말자고 늘 다짐합니다.
수능이라는 것은, 결국 '수치'에 불과하니, 이것 하나 망친다고 해서 우리의 존재가 사그라드는 것이 아님을 인지해야 할 것입니다. 수능을 4번 망해도, 태양은 언제나 나의 부끄러운 정수리를 보다듬으며 어둠과 싸우더이다.
최소 히프(Min Heap)의 절차지향적 구현
Heap.c
#include "Heap.h"
Heap* HEAP_Create(int InitialSize)
{
Heap* NewHeap = (Heap*)malloc(sizeof(Heap));
NewHeap->Capacity = InitialSize;
NewHeap->UsedSize = 0;
NewHeap->Nodes = (HeapNode*)malloc(sizeof(HeapNode) * NewHeap->Capacity);
printf("size : %d\n", sizeof(HeapNode));
return NewHeap;
}
void HEAP_Destroy(Heap* H)
{
free(H->Nodes);
free(H);
}
void HEAP_Insert(Heap* H, int NewData)
{
int CurrentPosition = H->UsedSize;
int ParentPosition = HEAP_GetParent(CurrentPosition);
if (H->UsedSize == H->Capacity)
{
H->Capacity *= 2;
H->Nodes = (HeapNode*)realloc(H->Nodes, sizeof(HeapNode) * H->Capacity);
}
H->Nodes[CurrentPosition].Data = NewData;
//부모노드가 더 크다면 바꿔야 한다.
while (CurrentPosition > 0 && H->Nodes[CurrentPosition].Data < H->Nodes[ParentPosition].Data)
{
HEAP_SwapNodes(H, CurrentPosition, ParentPosition);
CurrentPosition = ParentPosition;
ParentPosition = HEAP_GetParent(CurrentPosition);
}
H->UsedSize++;
}
void HEAP_SwapNodes(Heap* H, int Index1, int Index2)
{
int CopySize = sizeof(HeapNode);
HeapNode* Temp = (HeapNode*)malloc(CopySize);
memcpy(Temp, &H->Nodes[Index1], CopySize);
memcpy(&H->Nodes[Index1], &H->Nodes[Index2], CopySize);
memcpy(&H->Nodes[Index2], Temp, CopySize);
free(Temp);
}
//최솟값을 삭제하는 함수
void HEAP_DeleteMin(Heap* H, HeapNode* Root)
{
int ParentPosition = 0;
int LeftPosition = 0;
int RightPosition = 0;
//최솟값 노드가 루트 노드라서, 이 쪽을 일단 초기화하고, 최우측 노드와 교환 준비
memcpy(Root, &H->Nodes[0], sizeof(HeapNode));
memset(&H->Nodes[0], 0, sizeof(HeapNode));
H->UsedSize--;
//최우측 노드와 교환
HEAP_SwapNodes(H, 0, H->UsedSize);
LeftPosition = HEAP_GetLeftChild(0);
RightPosition = LeftPosition + 1;
while (1)
{
int SelectedChild = 0;
if (LeftPosition >= H->UsedSize)
break;
//마지막 끝 계산인 경우인데, 이 경우 LeftPosition이 마지막 노드라서 Selected가 자연스레 선택될 수밖에 없다.
if (RightPosition >= H->UsedSize)
{
SelectedChild = LeftPosition;
}
else
{
if (H->Nodes[LeftPosition].Data > H->Nodes[ParentPosition].Data)
SelectedChild = RightPosition;
else
SelectedChild = LeftPosition;
}
if (H->Nodes[SelectedChild].Data < H->Nodes[ParentPosition].Data)
{
HEAP_SwapNodes(H, ParentPosition, SelectedChild);
ParentPosition = SelectedChild;
}
//타겟 인덱스의 데이터가 그 부모의 데이터보다 크다면 정상적인 배치가 완료되었다고 볼 수 있다. 그러므로 break.
else
break;
LeftPosition = HEAP_GetLeftChild(ParentPosition);
RightPosition = LeftPosition + 1;
}
if (H->UsedSize < (H->Capacity / 2))
{
H->Capacity /= 2;
H->Nodes = (HeapNode*)realloc(H->Nodes, sizeof(HeapNode) * H->Capacity);
}
}
int HEAP_GetParent(int Index)
{
return (int)((Index - 1) / 2);
}
int HEAP_GetLeftChild(int Index)
{
return (2 * Index + 1);
}
void HEAP_PrintNodes(Heap* H)
{
int i = 0;
for (i = 0; i < H->UsedSize; i++)
{
printf("%d ", H->Nodes[i].Data);
}
printf("\n");
}
main.c
//최소 히프의 테스트를 위한 코드
#include "Heap.h"
int main(void)
{
Heap* H = HEAP_Create(3);
HeapNode MinNode;
HEAP_Insert(H, 12);
HEAP_Insert(H, 87);
HEAP_Insert(H, 111);
HEAP_Insert(H, 34);
HEAP_Insert(H, 16);
HEAP_Insert(H, 75);
HEAP_PrintNodes(H);
HEAP_DeleteMin(H, &MinNode);
HEAP_PrintNodes(H);
HEAP_DeleteMin(H, &MinNode);
HEAP_PrintNodes(H);
HEAP_DeleteMin(H, &MinNode);
HEAP_PrintNodes(H);
HEAP_DeleteMin(H, &MinNode);
HEAP_PrintNodes(H);
HEAP_DeleteMin(H, &MinNode);
HEAP_PrintNodes(H);
HEAP_DeleteMin(H, &MinNode);
HEAP_PrintNodes(H);
}
테스트 실행결과 :
size : 4
12 16 75 87 34 111
16 87 75 111 34
34 87 75 111
87 111 75
75 111
111
0 XDK (+0)
유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.
-
댓글 없는데 메인일 수가 잇나 0 3
ㄹㄱㅎㅃ
-
할 수 있을까요? 하루 풀실모보고 다음날 오답하고 이런식으로...? 포기하려고...
-
근데 아직도 궁금한 게 레어는 어케 갖는 거임요 6 2
경매 올라온 거 빼곤 다 고정된건가욤
-
갑자기 놀이공원 가고 싶네요! 8 2
롤코도 타고 아이스크림도 먹고, 불꽃놀이도 보고 싶어요!
-
더프 앞자리 시2발년아 0 8
너의 빌런짓 덕분에 멘탈 터졌던 작수때 기억이 떠올랐다 고맙다 너가 입으로 소리낸...
-
제발 3 1
제발제옆에앉지말아주세요 이쁜여자도안되고잘생긴남자도안되고반대도안돼요...
-
진학사 모의지원 평균은 0 0
믿을만한건가요? 생각보다 낮은거 같아서.. 작년 합격 점수보다 한 10점은 낮은거 같은데
-
레어를 만들어라 0 0
하투하 지우로
-
제가 뭐 4 3
수능 한번 더 보겠다고 말이라도 했습니까
-
다상다독퀄어떤가요?? 0 0
연계체감 많이되나??
-
생각해보니 9년전이네;;
-
대통령님 커뮤 많이 하시네.. 8 0
지금 트위터에서 댓글이랑 키배중임..
-
미적분 왜 재밌냐 0 3
아직 초반이라 그런가 그래도 이 재밌는 걸 1년 씩이나 늦게 시작하다니 인생 손해봣서
-
7월 더프 영어 0 0
어려운 건가요? 생윤 윤사도 난이도 평가 부탁드려요
-
나도 메인 가고 싶은데 21 27
메인 갈 만한 그럴 요소가 없음
-
어디 카페라도 가서 3 0
물2라도 좀 해야겠다 하루를 풀로 날리는건 좀 그렇네
-
쿼티가 남자일리가 없어 0 2
-
내아내임 4 3
왤캐이쁨 ㅋㅋ
-
화1 2311 Again 4 2
분포 넘모 예쁨
-
이 이모티콘은 무슨 의도인가요?! 11 1
눈이 죽어있어요!
-
개념의 신 vs 시발점 0 0
개념의 신 정승제 쌤 강의인데 많이들 모르더라 대부분 미적1은 시발점, 아니...
-
일요일에 공부<<엇캐 하는거임 6 3
7월부터 공부 시작한 반수생이라 할거 개많은데도 공부 하나도 안되는디... 걍 별로...
-
멘헤라주의보삐용삐용 10 1
공간도형죽여버려
-
국어 시간단축이 불가함 8 2
2606급 아니면 시간 거의 못남김 내생각에 거의 모든선지를 다읽어서 그런거같은데
-
수능수학전문과외 - 6모보다 수능성적이 낮을 시 수업료 전액환불 계약 0 0
- 6모보다 수능성적이 낮을 시 수업료 전액환불 계약 (6모 3-5등급 이하만...
-
내가 매체를 개빨리품 3 0
손가락걸기를 생활화하자
-
범작가 vs M북스 전쟁 근황 3 8
-
수영하고 싶다 6 1
어푸어푸 근데 사실 수영할 줄 모름 그리고 더워서 바다는 가고 싶지 않음
-
범작가입니다. 44 27
메리포핀스 출판사 대표인 '송서림 대표'님께서 올린 영상에 대한 진실입니다. 반드시...
-
27 전국서바 수학 1회 84점 어느수준인가요? 3 0
시간 내엔 84점이고 104분쯤 걸려서 88점인데 이정도면 1 뜰까요?
-
슬픈 이별을 겪었다 14 2
내 자석펫이 죽었음
-
경제 지문 좀 재밌어보이네용 배경지식을 요구하는 척하면서 그 지식을 개론 수준으로...
-
전대실모 등급 예측해주세요 0 0
국어 95 수학 73 정법 42 사문 38
-
저에게는 법조인의 꿈이 있습니다 의대 가려다가 못 가고 다음에 가진 꿈이 변호사에요...
-
5월에 화1 -> 물1 돌리고 개념강의만 듣고 6평 1컷 찍었던 기억이
-
과외생이 자기가 푼 모고 수업 전에 보내는 거 ㄱㅊ? 0 0
영어 맨날 4등급인데 최소한 3은 만들어야겠다는 생각에 방학 동안만 영어 과외...
-
어려운 언매여도 몇분컷까지는 들어와야하나요???
-
시중 사설에서 찾아보기 힘든 6모스타일 22번 수열 문제 넉넉하게 25세트...
-
오답노트 안 보게 되는 거, 게을러서가 아님 다시 볼 만한 게 안 적혀 있어서 그런...
-
으 더우니까 스트레스 상승함 4 1
에어컨 틀면 춥고 끄면 덥고 이걸 어째!!!!
-
근데 책쓰기보다는 2 0
걍 요상한 작가한테 이름 빌려주고 국어 백분위 100입니다 호소 할 수 있게...
-
지구 n제 다음에 뭐하지 4 0
Oz 베이직 모고 하고 Oz 실전 문제 끝나가는데 폴라리스 콜렉션이 있고 아틀리에가...
-
생윤 3 될까요? 2 0
4달 좀 안남았는데 영어+생윤으로 최저 맞출건데 생윤 최소3 될까요 ㅠㅠ 시간이 너무 촉박한가요?
-
ㅅㅂ 사탐은 개념 기출 하고 4가 쳐 뜨네 ㅋㅋ
-
더위 안 타시는 분 있나요 19 0
비결 좀 ㅠㅠ , , , , 서바 강k 현우진 수학 확통 기하 미적 악어오름 강영찬...
-
리트 끝 4 4
응시하신 분들 수고많았슴다 내년에는 더 높은 점수 나오길!
-
전문지식보다 개념 간 관계·논증 구조·선지의 미세한 범위 판별 중시과학 계산 부담은...
-
과년도 실모 상관없겠죠? 2 0
과년도 실모, 시대컨 등등 아직 파이널도 아니니까 이거 풀어도 상관없겠죠?
-
원하는 대학/학과 OR 성적 나부터 국수영생사 백분위 90↑ 97↑ 2↑ 96↑ 100
-
아 사투리 너무 싫음 ㅠ 18 1
(당사자성 발언임 나 사투리 씀) 그냥 나랑 너무 안 맞음 본인도 사투리 그렇게...


저는 얼마전에 heap sort 처음 짜봤는데힙정렬... 배열에 대한 이해도가 굉장히 중요하죠. 이진 트리의 구조를 배열로 치환해야 하는 거니까요. 결국 Heap이라고 하는 구조가 링크드리스트보다는 배열로 구현하는 것이 훨씬 더 유리하기 때문이 아닐까 합니다.
그냥 bubble sort만 썼었는데 여러개 배우고나니까 확실히 가장 쉽긴해도 가장 효율적인건 아니더라구요
버블 정렬 같은 경우는, 자료 데이터 수가 급증하면 시간 복잡도가 극악적으로 늘어난다는 것이 치명적 단점으로 작용하죠. 그래서, 1차원적 그러니까 선형적 자료(배열)에서 정렬을 할 때, 만약 "성능"의 문제를 치밀히 고려해야 한다면 Quicksort나 Heapsort 같은 것들이 등장하는 것이겠구요.
자료구조라는 것이 결국은 "성능"과 "효율"을 생각했을 때 더 중요한 분야가 아닌가 합니다. 그런 관점에서 어떤 때는 알고리즘보다 자료구조의 이해가 더 적확한 사람들이 개발자로서 더 많은 능력을 함유한 것이 아닌가 할 때도 있어요. 학부따리의 생각이긴 합니다만..

그래서 결국은 수학을 잘해야 하는듯 해요..맞는 것 같습니다 ㅜㅜ 결국은 수학적 사고력...