def merge_sort(a, s, e):
if s < e:
p = (e + s) // 2
merge_sort(a, s, p)
merge_sort(a, p + 1, e)
merge(a, s, p, e)
def merge(a, s, p, e):
global cnt
global ret
if cnt <= 0:
return
i = s
j = p + 1
temp = []
while i <= p and j <= e:
if a[i] <= a[j]:
temp.append(a[i])
i += 1
else:
temp.append(a[j])
j += 1
cnt -= 1
if cnt == 0:
ret = temp[-1]
while i <= p:
temp.append(a[i])
i += 1
cnt -= 1
if cnt == 0:
ret = temp[-1]
while j <= e:
temp.append(a[j])
j += 1
cnt -= 1
if cnt == 0:
ret = temp[-1]
for i in range(len(temp)):
a[s + i] = temp[i]
N, K = map(int, input().split())
a = list(map(int, input().split()))
global cnt
global ret
cnt = K
ret = -1
merge_sort(a, 0, N - 1)
print(ret)
cnt -= 1해주며 모든 삽입 부분을 모니터링하는 코드가 너무 지저분해 보여서 아쉽다.. 모니터링을 해주기 위해 어쩔 수 없이 넘어갔다..
다른 풀이
이 풀이와 나와의 차이점
1. merge_sort(a)의 리턴값을 left, right로 나누어 한번에 해결했다.
2. list[:mid] 처럼 슬라이스 방식을 사용하여 가독성을 높혔다.
3. ans 라는 list를 선언한 뒤 값을 추가할 때마다 같이 추가하여 마지막에 ans[k - 1]로 몇번째에 넣었는지 식별할 수 있도록 했다는 점이다.