백준 알고리즘

백준 24060 파이썬

KokoaJelly 2023. 2. 4. 03:25

https://www.acmicpc.net/problem/24060

 

24060번: 알고리즘 수업 - 병합 정렬 1

첫째 줄에 배열 A의 크기 N(5 ≤ N ≤ 500,000), 저장 횟수 K(1 ≤ K ≤ 108)가 주어진다. 다음 줄에 서로 다른 배열 A의 원소 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 109)

www.acmicpc.net

 

import sys
input = sys.stdin.readline

def merge_sort(num_list):
    if len(num_list) == 1:
        return num_list
    
    mid = len(num_list) + 1 // 2
    left = num_list[:mid]
    right = num_list[mid:]

    left = merge_sort(left)
    right = merge_sort(right)

    return merge(left, right)

def merge(left, right):
    i,j = 0, 0
    sorted_list = []
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            sorted_list.append(left[i])
            count.append(left[i])
            i += 1
           

        else:
            sorted_list.append(right[j])
            count.append(right[j])
            j += 1
            
            

    while i < len(left):
        sorted_list.append(left[i])
        count.append(left[i])
        i += 1 
        

    while j < len(right):
        sorted_list.append(right[j])
        count.append(right[j])
        j += 1
        
    return sorted_list

n, k = map(int,input().split())
num_list = [int(x) for x in input().split()]
count = []
merge_sort(num_list)

if len(count) >= k:
    print(count[k-1])

else:
    print(-1)

생각보다 까다로운 문제다. 병합정렬은 나중에 다시 다루도록 하겠다.

기본적인 병합정렬에서, 빈 리스트에 저장되는 문자를 전부 넣어주면 된다.