알고리즘 문제
백준 24060 알고리즘 수업 - 병합정렬 1
gaelim
2022. 9. 10. 07:46
반응형
병합정렬 수행 중 k번째로 저장되는 숫자를 구한다. 값이 저장될때마다 k 카운팅을 세주면 구할 수 있다. 파이썬은 ++가 없어서 좀 코드가 길어졌다..
해결하는 과정서 더 현명한 방법이 없을까? 라는 생각이 들었던 문제다. k 번째 수 라는 병합정렬 응용 문제가 있긴한데... 기시감에 다시 찾아보았는데 같은 류의 문제는 아닌 듯하다.
import sys
input = sys.stdin.readline
n, k = list(map(int, input().split()))
_v = list(map(int,input().split()))
ans = -1
def merge_sort(v, i, j):
if i < j:
m = (i+j)//2
merge_sort(v, i, m)
merge_sort(v, m+1, j)
merge(v, i, m+1, j)
def merge(v, i, m, j):
global k
global ans
p = i
q = m
r = 0
temp = [0] * (j-i+1)
while p < m and q <= j:
k-=1
if v[p] > v[q]:
temp[r] = v[q]
q+=1
else:
temp[r] = v[p]
p+=1
if k == 0:
ans = temp[r]
r+=1
while p < m:
temp[r] = v[p]
k-=1
if k == 0:
ans = temp[r]
p+=1
r+=1
while q <= j:
temp[r] = v[q]
k-=1
if k == 0:
ans = temp[r]
q+=1
r+=1
p=i
i=0
while p<=j:
v[p] = temp[i]
p+=1
i+=1
merge_sort(_v, 0, n-1)
print(ans)
반응형