📖 문제 설명
문제 : https://www.acmicpc.net/problem/24060
💡요구사항 분석
merge_sort(A[p..r]) { # A[p..r]을 오름차순 정렬한다.
if (p < r) then {
q <- ⌊(p + r) / 2⌋; # q는 p, r의 중간 지점
merge_sort(A, p, q); # 전반부 정렬
merge_sort(A, q + 1, r); # 후반부 정렬
merge(A, p, q, r); # 병합
}
}
# A[p..q]와 A[q+1..r]을 병합하여 A[p..r]을 오름차순 정렬된 상태로 만든다.
# A[p..q]와 A[q+1..r]은 이미 오름차순으로 정렬되어 있다.
merge(A[], p, q, r) {
i <- p; j <- q + 1; t <- 1;
while (i ≤ q and j ≤ r) {
if (A[i] ≤ A[j])
then tmp[t++] <- A[i++]; # tmp[t] <- A[i]; t++; i++;
else tmp[t++] <- A[j++]; # tmp[t] <- A[j]; t++; j++;
}
while (i ≤ q) # 왼쪽 배열 부분이 남은 경우
tmp[t++] <- A[i++];
while (j ≤ r) # 오른쪽 배열 부분이 남은 경우
tmp[t++] <- A[j++];
i <- p; t <- 1;
while (i ≤ r) # 결과를 A[p..r]에 저장
A[i++] <- tmp[t++];
}

import sys
n, k = map(int, sys.stdin.readline().split())
arr = list(map(int, sys.stdin.readline().split()))
def merge_sort(arr, start, end): # 리스트를 잘게 쪼개기
if start < end:
mid = (start + end) // 2
merge_sort(arr, start, mid)
merge_sort(arr, mid + 1, end)
merge(arr, start, mid, end)
def merge(arr, start, mid, end):
tmp = [0] * (end - start + 1) # 정렬된 배열을 담기 위한 배열
first_arr_index = start # 첫번째 조개진 배열 스타트 지점
second_arr_index = mid + 1 # 두번째 조개진 배열 스타트 지점
merge_arr_index = 0 # 정렬된 배열을 담기위한 인덱스
while first_arr_index <= mid and second_arr_index <= end: #조개진 배열을 넘어가지 않도록 예외 처리
if arr[first_arr_index] <= arr[second_arr_index]: # 크기 비교
tmp[merge_arr_index] = arr[first_arr_index] # 배열에 순차적으로 삽입
first_arr_index += 1 # 다음 인덱스 번호로 증가
else:
tmp[merge_arr_index] = arr[second_arr_index]
second_arr_index += 1
merge_arr_index += 1 # 다음 인덱스에 정렬된 값 삽입하기 위한 증가
while first_arr_index <= mid: # 만약 첫번째 배열의 값이 아직 tmp 배열에 저장되지 않았을 경우
tmp[merge_arr_index] = arr[first_arr_index]
first_arr_index += 1
merge_arr_index += 1
while second_arr_index <= end:
tmp[merge_arr_index] = arr[second_arr_index]
second_arr_index += 1
merge_arr_index += 1
for i in range(start, end + 1): # tmp배열을 arr 배열에 삽입
arr[i] = tmp[i - start]
merge_sort(arr, 0, len(arr) - 1)
🧑💻 코드 풀이
import sys
n, k = map(int, sys.stdin.readline().split())
arr = list(map(int, sys.stdin.readline().split()))
def merge_sort(arr, start, end):
if start < end:
mid = (start + end) // 2
left_sort = merge_sort(arr, start, mid)
if left_sort != -1:
return left_sort
right_sort = merge_sort(arr, mid + 1, end)
if right_sort != -1:
return right_sort
return merge(arr, start, mid, end)
return -1
def merge(arr, start, mid, end):
global k
tmp = [0] * (end - start + 1)
first_arr_index = start
second_arr_index = mid + 1
merge_arr_index = 0
while first_arr_index <= mid and second_arr_index <= end:
if arr[first_arr_index] <= arr[second_arr_index]:
tmp[merge_arr_index] = arr[first_arr_index]
first_arr_index += 1
else:
tmp[merge_arr_index] = arr[second_arr_index]
second_arr_index += 1
merge_arr_index += 1
k -= 1
if k == 0:
return tmp[merge_arr_index - 1]
while first_arr_index <= mid:
tmp[merge_arr_index] = arr[first_arr_index]
first_arr_index += 1
merge_arr_index += 1
k -= 1
if k == 0:
return tmp[merge_arr_index - 1]
while second_arr_index <= end:
tmp[merge_arr_index] = arr[second_arr_index]
second_arr_index += 1
merge_arr_index += 1
k -= 1
if k == 0:
return tmp[merge_arr_index - 1]
for i in range(start, end + 1):
arr[i] = tmp[i - start]
return -1
result = merge_sort(arr, 0, len(arr) - 1)
print(result)