깔금하게 잘 짜져있나요?
혹시 복붙하시더라도 이름은 지우지 말아주세요ㅠㅠ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | #include <iostream> /* YCY */ #define CompPriority(X, Y) Y - X /* 우선순위 비교 매크로 */ #define GetParentIDX(X) X/2 /* 부모 노드의 인덱스 값 반환 매크로 - (자식 노드의 인덱스 값 / 2) */ #define GetLChildIDX(X) X*2 /* 왼쪽 자식 노드의 인덱스 값 반환 매크로 - (부모 노드의 인덱스 값 * 2) */ #define GetRChildIDX(X) X*2+1 /* 오른쪽 자식 노드의 인덱스 값 반환 매크로 - (부모 노드의 인덱스 값 * 2 + 1) */ using namespace std; /* Struct */ typedef struct min_heap * PtrHeap; typedef struct min_heap { int numOfData; /* Heap Length */ int heapArray[100010]; /* Heap Data Array */ } MIN_HEAP; MIN_HEAP mHeap = { 0, {0, } }; /* 두 개의 자식 노드 중 높은 우선순위의 자식 노드 인덱스 값 반환 함수 */ int GetHiPriChildIDX(PtrHeap mHeap, int idx) { /* 자식 노드가 존재하지 않는 경우 */ if (GetLChildIDX(idx) > mHeap->numOfData) { return 0; } /* 자식 노드가 왼쪽 자식 노드 하나만 존재하는 경우 */ else if (GetLChildIDX(idx) == mHeap->numOfData) { return GetLChildIDX(idx); } /* 자식 노드가 둘 다 존재하는 경우 */ else { return CompPriority(mHeap->heapArray[GetLChildIDX(idx)], mHeap->heapArray[GetRChildIDX(idx)]) < 0 ? GetRChildIDX(idx) : GetLChildIDX(idx); } /* 1. return GetRChildIDX() = 오른쪽 자식 노드의 우선순위가 높은 경우 2. return GetLChildIDX() = 왼쪽 자식 노드의 우선순위가 높은 경우 */ } /* Heap Insert Method */ void HeapInsert(PtrHeap mHeap, int num) { /* Integer */ int idx = mHeap->numOfData + 1; /* 새 노드가 저장 될 인덱스 값 저장 */ while (idx != 1) { /* 새 노드의 우선순위가 높은 경우 */ if (CompPriority(num, mHeap->heapArray[GetParentIDX(idx)]) > 0) { mHeap->heapArray[idx] = mHeap->heapArray[GetParentIDX(idx)]; /* 부모 노드를 한 레벨 내린다. */ idx = GetParentIDX(idx); /* 새 노드를 한 레벨 올린다. */ } else { break; } /* 새 노드의 우선순위가 낮은 경우 */ } mHeap->heapArray[idx] = num; /* 새 노드를 배열에 저장 */ mHeap->numOfData++; /* 힙의 수 증가 */ } /* Heap Delete Method */ int HeapDelete(PtrHeap mHeap) { /* Integer */ const int retData = mHeap->heapArray[1]; /* 반환을 위해 힙에서 삭제 할 데이터 */ int lastElem = mHeap->heapArray[mHeap->numOfData]; /* 힙의 마지막 노드 값 저장 */ int parentIDX = 1; /* 루트 노드가 위치해야 할 인덱스 값 저장 */ int childIDX = 0; /* 루트 노드의 우선순위가 높은 자식 노드를 시작하는 반복문 */ while (childIDX = GetHiPriChildIDX(mHeap, parentIDX)) { /* 마지막 노드의 우선순위과 높은 경우 */ if (CompPriority(lastElem, mHeap->heapArray[childIDX]) >= 0) { break; } /* 마지막 노드의 우선순위가 낮은 경우 */ /* 비교대상 노드의 위치를 한 레벨 올린다. */ mHeap->heapArray[parentIDX] = mHeap->heapArray[childIDX]; /* 마지막 노드가 저장 될 위치정보를 한 레벨 내린다. */ parentIDX = childIDX; } /* 반복문을 탈출하면 ParentIDX 에는 마지막 노드의 위치 정보가 저장된다. */ mHeap->heapArray[parentIDX] = lastElem; /* 마지막 노드의 최종 저장 */ mHeap->numOfData--; /* 힙의 수 감소 */ /* 힙에서 삭제 된 값 반환 */ return retData; } int main(void) { /* Integer */ int num = 0, mTemp; cin >> num; for (int count = 0; count < num; count++) { /* input */ cin >> mTemp; /* output */ mTemp != 0 ? HeapInsert(&mHeap, mTemp) : printf("%d\n", (mHeap.numOfData == 0 ? 0 : HeapDelete(&mHeap))); } return 0; } | cs |
main , 함수, structure 분리 안해서 비추
헤더파일 분활? 알고리즘 문제 푸는 중이라서 분리 못함
주석이 너무 많아서 비추. 책은 clean code를 추우쳔
혹시 교수님이 까래면 까래서 쓰는 주석이면 애도를 표함
else { return CompPriority(mHeap->heapArray[GetLChildIDX(idx)], mHeap->heapArray[GetRChildIDX(idx)]) < 0 ? GetRChildIDX(idx) : GetLChildIDX(idx); } 이거 한 라인에 써서 비추
나 삼항연산자 개 좋아함 ㅋㅋ 숏코드 존나 좋아함
삼항연산자 얼마나 이쁘냐 ㅋㅋ
근데 한줄짜리 주석은 /**/ 이거 왜 쓰는 거임? 너가 일관성 있게 다 저렇게해서 스타일이라 상관없지만 걍 궁금함
주석은 좋은데 /**/는 좀 정신없오...
지스탈 아니라고 쓸데없는거 지적하는거 웃기네 알고리즘을 올렸으면 알고리즘을 봐야지
근데 걍 make_heap이나 우선순위큐 쓰면안됨?
과한 주석 안좋음... 조금만 바뀌어도 다 바꿔써야되는데.. 어느순간부터 주석은 업데이트 안되고 코드만 업데이트될 것임. 근데 주석으로 의사코드 짜놓은 다음에 정리한 거 같기도 한데 그냥 아예 다 모아서 정리해버리는 건 어떰?
여튼 과한 주석은 나중 되면 결국 주석 안 읽게 될 수 있읍니다. 주석을 믿지마! 코드를 믿어! 그렇게 되는거죠
다들 답변 감사 감사. 난 이상하게 /* */ 주석이 너무 좋음;;; // 는 머라고 해야하지 이상해서
공부할려고 주석을 좀 많이 달았는데 다음에는 안달갱
짜져->짜여
소스나눔//분활->분할
근데 난 저런식으로 주석달면서 공부 많이 된다고 생각해