수도코드를 이해하는 게 관건이었던 문제,, 사실 100% 이해하지 못해도 문제를 풀 수 있어서 먼저 문제를 풀었다.. 그래도 병합정렬을 이해하면 분명 도움이 될 것 같아 손으로 엄청 써보며 이해를 했다.(좀 복잡하게 병합정렬을 정의한 느낌..)
def merge_sort(A, p, r): # A[p..r]을 오름차순 정렬한다.
if p < r:
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]은 이미 오름차순으로 정렬되어 있다.
def merge(A, p, q, r):
i = p
j = q+1
tmp = []
while i<=q and j<=r:
if A[i] <= A[j]:
tmp.append(A[i])
i += 1
else:
tmp.append(A[j])
j += 1
while i <= q: # 왼쪽 배열 부분이 남은 경우
tmp.append(A[i])
i += 1
while j <= r: # 오른쪽 배열 부분이 남은 경우
tmp.append(A[j])
j += 1
i = p
t = 0
while i <= r: # 결과를 A[p..r]에 저장
A[i] = tmp[t]
i += 1
t += 1
N, K = map(int, input().split())
A = list(map(int, input().split()))
merge_sort(A, 0, N-1)
while i <= r: # 결과를 A[p..r]에 저장
A[i] = tmp[t]
i += 1
t += 1
import sys
input = sys.stdin.readline
def merge_sort(A, p, r): # A[p..r]을 오름차순 정렬한다.
if p < r:
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]은 이미 오름차순으로 정렬되어 있다.
def merge(A, p, q, r):
i = p
j = q+1
tmp = []
global count, result
while i<=q and j<=r:
if A[i] <= A[j]:
tmp.append(A[i])
i += 1
else:
tmp.append(A[j])
j += 1
while i <= q: # 왼쪽 배열 부분이 남은 경우
tmp.append(A[i])
i += 1
while j <= r: # 오른쪽 배열 부분이 남은 경우
tmp.append(A[j])
j += 1
i = p
t = 0
while i <= r: # 결과를 A[p..r]에 저장
A[i] = tmp[t]
count += 1
if count == K:
result = A[i]
break
i += 1
t += 1
N, K = map(int, input().split())
A = list(map(int, input().split()))
count = 0
result = -1
merge_sort(A, 0, N-1)
print(result)
