dlcksdnd321   5년 전

bufferreader와 write도 써봣는데 시간초가가 생깁니다.

이유좀 알려주시면 감사하겠습니다

dlcksdnd321   5년 전

n을 static으로 바꾸고 47,63 줄 바꿨는데  시간초과입니다. ㅠㅠ

bongssi   5년 전

코드를 실행시켜 본것은 아니지만 시간초과가 날 수 밖에 없어 보입니다. 답도 역순으로 나올 것 같고요. 원소의 수 n만큼 makeHeap(0)을 호출하고 있는데요. makeHeap(0)으로 발생하는 재귀호출의 수를 결정하는 것은 heapNum 변수값 뿐입니다. 왼쪽 자식이나 오른쪽 자식에 대한 재귀호출을 선택적으로 하고 있지 않으므로 heap에 들어있는 모든 원소를 다 돌게 되겠죠. 그리고 heapNum은 각 iteration마다 1씩 줄어들고 있으므로 n^2 알고리즘입니다. 그래서 시간초과가 나는 것으로 보이고요... 그리고 부모와 자식의 값을 비교하여 둘 중에 큰 값을 위로 올리고 있으므로 makeHeap(0)이 수행되고 나면 가장 큰 값이 0번으로 오게 될 것이고, 그 값을 가장 끝 인덱스의 값과 바꾼 후 출력하므로 오름차순이 아니라 내림차순 정렬의 결과가 출력될 것으로 보이네요.

dlcksdnd321   5년 전

아.. bongssi님 감사합니다!!! 추가로 2가지 질문만 더하게습니다.

makeheap에서 nlogn 번 돌고 heapNum1 1씩줄어들 때마다 또 도니까 nlogn * n 해서  n^2 알고리즘 인가요 ???

그러면 makeHeap을 할때 어떻게 logn의 알고리즘으로 가장 작은수를 0 인덱스로 올릴 수 있을까요 ??

bongssi   5년 전

nlogn * n 이면 n^2logn 이지 n^2 이 아닙니다.

구현하신 makeHeap이 하는 동작은 O(n)에 최대값을 찾아서 맨 위로 올리는 것입니다.

heapNum을 n이라 했을 때, 각 iteration 마다 makeHeap에 의해 n, n-1, n-2, ... , 1번의 재귀호출이 일어날 것입니다. 1부터 n까지의 합은 n*(n+1)/2 이므로 O(n^2) 알고리즘이라고 한 것입니다.

makeHeap을 할때 logn의 알고리즘으로 가장 작은 수를 0 인덱스로 올리는 것이 이 문제의 핵심입니다. minimum heap을 구성하는 방법은 인터넷에도 많이 나와있으니 내용을 참고하셔서 새로 만드시는 것을 추천합니다.

dlcksdnd321   5년 전

감사합니다 bongssi님 덕분에 배워갑니다

댓글을 작성하려면 로그인해야 합니다.