티스토리 뷰

PS/BOJ Python

1715번 - 카드 정렬하기

zpqmdh 2023. 7. 17. 16:29

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

 

1715번: 카드 정렬하기

정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장

www.acmicpc.net

이 문제를 풀 때 가장 중요한 점은 '우선순위 큐'를 사용한다는 것이다. 그리고 파이썬에는 heapq 모듈에 구현되어 있다. 

우선 카드의 수를 입력받은 리스트 A를 힙으로 바꾼다. 그리고 우선순위 큐는 우선순위가 낮은 값부터 pop하기 때문에 최솟값을 쉽게 구할 수 있다. 따라서 두 번의 pop을 통해 최솟값을 꺼내고 그 둘을 더한 뒤 다시 우선순위 큐에 넣는다.

이 과정을 진행하면 최솟값끼리의 합이 계속 진행되기 때문에 최소한의 비교로 카드를 정렬할 수 있다. 

만약 우선순위 큐에 1개의 값만 남아있다면 두 개의 원소를 뺄 수 없고 비교가 종료되었다는 뜻이니 그때 whlie 문을 종료하고 값을 출력한다.

# 카드 정렬하기
import sys
from heapq import *
input = sys.stdin.readline

N = int(input())
A = [int(input()) for _ in range(N)]
heapify(A)
answer = 0

while True:
    if len(A) == 1:
        print(answer)
        break
    a = heappop(A)
    b = heappop(A)
    value = a+b
    heappush(A, value)
    answer += value

 

'PS > BOJ Python' 카테고리의 다른 글

11729번 - 하노이 탑 이동 순서  (0) 2023.10.04
14719번 - 빗물  (0) 2023.07.21
17298번 - 오큰수  (0) 2023.07.14
10986번 - 나머지 합  (0) 2023.07.12
11723번 - 집합  (0) 2023.06.25
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함