코딩 테스트/백준

[Python] 백준 24060 알고리즘 수업 - 병합 정렬 1

위시리 2024. 12. 31. 17:14

 

문제 분석

  • N개의 서로 다른 양의 정수가 저장된 배열 A
  • 병합 정렬로 배열 A의 오름차순을 정렬할 경우 배열 A에 k번째 저장되는 수를 구하라
  • 저장 횟수가 k보다 작으면 -1 출력

 

정답 코드

1차 - 실패

import sys
input = sys.stdin.readline

global cnt

def merge_sort(arr, k) :
    if len(arr) < 2 :
        return arr

    mid = len(arr) // 2
    low_arr = merge_sort(arr[:mid], k)
    high_arr = merge_sort(arr[mid:], k)

    merged_arr = []
    l=h=0
    cnt = 0
    while l < len(low_arr) and h < len(high_arr) :
        if low_arr[l] < high_arr[h] :
            merged_arr.append(low_arr[l])
            cnt += 1
            l += 1
        else :
            merged_arr.append(high_arr[h])
            cnt += 1
            h += 1
        if cnt == k :
            print(merged_arr[-1])
    merged_arr += low_arr[l:]
    merged_arr += high_arr[:h]
    if cnt < k:
        print(-1)
    return merged_arr

n, k = map(int, input().split())
arr = list(map(int, input().split()))
merge_sort(arr, k)

 

다른 사람 코드 1

import sys
input = sys.stdin.readline

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

def merge(A, p, q, r) :
    global cnt, res
    l = p
    h = q+1
    tmp = []

    while l <= q and h <= r :
        if A[l] < A[h] :
            tmp.append(A[l])
            l += 1
        else :
            tmp.append(A[h])
            h += 1

    while l <= q : # 배열 왼쪽 부분이 남은 경우
        tmp.append(A[l])
        l += 1

    while h <= r : # 배열 오른쪽 부분이 남은 경우
        tmp.append(A[h])
        h += 1

    l = p
    t = 0

    while l <= r : # 결과를 A[p~r]에 저장
        A[l] = tmp[t]
        cnt += 1
        if cnt == k :
            res = A[l]
            break
        l += 1
        t += 1

n,k = map(int, input().split())
A = list(map(int, input().split()))
cnt = 0
res = -1
merge_sort(A, 0, n-1)
print(res)