https://www.acmicpc.net/board/view/32737
질문 작성 시 틀린 코드를 한 글자도 틀림 없이 정확하게 올리라고 되어 있습니다.
위 설명만으로는 메모리 할당 실패에 의한 런타임 에러인지, 함수가 내부적으로 잘못되었는지, 혹은 기타 다른 원인이 있는지 알 수 없습니다.
2751번 - 수 정렬하기 2
https://www.acmicpc.net/board/view/32737
질문 작성 시 틀린 코드를 한 글자도 틀림 없이 정확하게 올리라고 되어 있습니다.
위 설명만으로는 메모리 할당 실패에 의한 런타임 에러인지, 함수가 내부적으로 잘못되었는지, 혹은 기타 다른 원인이 있는지 알 수 없습니다.
있음직한 예를 들어보죠. 16개의 수를 임의로 골라 잘 섞어서 0~15의 인덱스로 하여 정렬한다고 생각해봅시다.
반으로 나눠서 정렬한 후 합칠 것이므로, 재귀호출하던 어느 순간에는 8~11의 인덱스를 정렬하는 순간이 올 것입니다.
8,9와 10,11을 각각 정렬된 후, 합치는 과정을 고려해봅시다. start가 8이고, end가 11이겠네요.
이때 sorted 배열은 11-8+1 = 4의 크기를 가지고, 인덱스로는 0~3을 갖습니다.
그런데 merge 함수 내의 while문을 잘 보시면, k의 초깃값이 start=8입니다.
그 상태에서 sorted[k]와 같이 하여 접근하고 있으므로, 배열의 범위를 초과하게 됩니다.
댓글을 작성하려면 로그인해야 합니다.
needid 4년 전
합병정렬을 쓸경우 보통
merge_sort()
merge_sort()
merge()
이런식으로 쓰고 merge() 안에 정렬된 배열을 따로 저장해두는 임시 배열을 하나 만들어두는걸로 압니다.
여기서 임시배열을 int *sorted = new int[end - start + 1] 이런식으로 할당을 했더니 런타임에러가 뜨는데 혹시 이유를 알 수 있을까요?