하루일문
[백준] 24060번 알고리즘 수업 - 병합 정렬 1 (파이썬) 본문
문제
24060번: 알고리즘 수업 - 병합 정렬 1
첫째 줄에 배열 A의 크기 N(5 ≤ N ≤ 500,000), 저장 횟수 K(1 ≤ K ≤ 108)가 주어진다. 다음 줄에 서로 다른 배열 A의 원소 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 109)
www.acmicpc.net
이 문제는 자리수를 /2를 계속하여 최대한 줄인 다음에 오름차순으로 정렬하는 문제이다.
예를 들어 4 5 1 3 2라면
[4, 5, 2], [3, 2] → [4, 5], [1], [3, 2] → [4] [5], [1], [3], [2] → [4, 5], [1], [3], [2] → [1, 4, 5], [2, 3] → [1, 2, 3, 4, 5]
이런식으로 변한다.
코드
import sys
input = sys.stdin.readline
def m_sort(a):
if len(a) == 1:
return a
mid = (len(a) + 1) // 2
# a_1이 하나 남을때까지 쪼개줘
a_1 = m_sort(a[ : mid])
# a_1을 제외하고 하나 남을때까지 쪼개줘
a_2 = m_sort(a[mid : ])
i, j = 0, 0
li_2 = []
while i < len(a_1) and j < len(a_2):
if a_1[i] < a_2[j]:
a_li.append(a_1[i])
li_2.append(a_1[i])
i += 1
else:
a_li.append(a_2[j])
li_2.append(a_2[j])
j += 1
while i < len(a_1):
a_li.append(a_1[i])
li_2.append(a_1[i])
i += 1
while j < len(a_2):
a_li.append(a_2[j])
li_2.append(a_2[j])
j += 1
# a_1으로 리턴
return li_2
N, K = map(int, input().split())
A = list(map(int, input().split()))
a_li = []
m_sort(A)
print(a_li)
if len(a_li) > K:
print(a_li[K - 1])
else:
print(-1)
해설
재귀함수를 이용하여 나눌수 있는 만큼 최대한 나누고 변화대는 숫자를 순서대로 li_2에 넣어준다.
후에 k-1번의 순서의 숫자를 찾아준다 없다면 -1를 반환한다.
'algorithm > baekjoon' 카테고리의 다른 글
[백준] 10828번 스택(파이썬) (0) | 2023.02.27 |
---|---|
[백준] 1063번 킹 (파이썬) (0) | 2023.02.26 |
[백준] 25305번 커트라인(파이썬) (0) | 2023.02.23 |
[백준] 10870번 피보나치 수 5 (파이썬) (0) | 2023.02.22 |
[백준] 10872번 팩토리얼 (파이썬) (0) | 2023.02.21 |