본문 바로가기

백준

[백준] 24060 - 알고리즘 수업 - 병합 정렬 1 (파이썬)

반응형

1. 문제

 

2. 코드

a, k = map(int, input().split())
l = list(map(int, input().split()))
n = 0
temp = []
tmp = []

def merge_sort(p, r):
    global l
    if p < r:
        q = int((p+r)/2)
        merge_sort(p, q)
        merge_sort(q+1, r)
        merge(p, q, r)

def merge(p, q, r):
    global temp
    tmp = []
    
    i = p
    j = q+1
    
    while i <= q and j <= r:
        if l[i] <= l[j]:
            tmp.append(l[i])
            temp.append(l[i])
            i+=1
        else:
            tmp.append(l[j])
            temp.append(l[j])
            j+=1
    while i <= q:
        tmp.append(l[i])
        temp.append(l[i])
        i+=1
    while j <= r:
        tmp.append(l[j])
        temp.append(l[j])
        j+=1
    
    for i in range(p, r+1):
        l[i] = tmp[i-p]
        
        
merge_sort(0, len(l)-1)

if len(temp) < k:
    print(-1)
else:
    print(temp[k-1])

 

3. 풀이

병합 정렬 문제이다. 해당 문제에 주어진 의사코드를 파이썬으로 잘 변환하기만 하면 된다. 

 

여기서 병합 정렬 (merge sort)란?

분할 정복(divide and conquer) 알고리즘 중 하나이다.

분할 정복 방법이란 문제를 작은 2개의 문제로 분리하고 각각을 해결한 후, 그 결과를 모아서 원래의 문제를 해결하는 방법이다. 2개의 문제로 분리하고 각각을 해결하는 방식을 택하기 때문에 순환호출(recursion)을 사용하여 구현되는 경우가 많다.

 

merge sort는 하나의 리스트를 더이상 분할할 수 없을 때까지 두 개로 분할하고 이 부분 리스트들을 정렬한 후, 합치는 방식으로 구현한다.

 

 

merge sort 설명 참고 사이트 : https://gmlwjd9405.github.io/2018/05/08/algorithm-merge-sort.html 

 

[알고리즘] 합병 정렬(merge sort)이란 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

728x90
반응형

'백준' 카테고리의 다른 글

[백준] 1183 - 약속 (파이썬)  (0) 2022.09.18
[백준] 1059 - 좋은 구간 (파이썬)  (0) 2022.08.31
[백준] 2981 - 검문 (파이썬)  (0) 2022.08.20
[백준] 1358 - 하키 (파이썬)  (0) 2022.08.18
[백준] 2477번 - 참외밭 (파이썬)  (0) 2022.08.17