문제풀이/BOJ

[Python] BOJ/백준 15903번 카드 합체 놀이

서채리 2022. 9. 10. 16:19

[문제]

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

 

15903번: 카드 합체 놀이

첫 번째 줄에 카드의 개수를 나타내는 수 n(2 ≤ n ≤ 1,000)과 카드 합체를 몇 번 하는지를 나타내는 수 m(0 ≤ m ≤ 15×n)이 주어진다. 두 번째 줄에 맨 처음 카드의 상태를 나타내는 n개의 자연수 a1,

www.acmicpc.net

 

[풀이]

처음에는 간단하게 sort 함수를 이용해 풀었는데 이는 O(nlogn)으로 우선순위 큐를 이용하면 O(logn)으로 시간복잡도를 줄일 수 있다.

우선순위 큐 사용시, 값을 바꿀 카드 2개를 우선순위 큐에 삽입만 하면 되기 때문에 매번 정렬해야하는 sort 보다 훨씬 효율적인 것이다.

 

따라서 cards 리스트를 만든 후 heapq 내장 모듈 사용해 힙을 구현했다.

 

 

[힙큐 사용 코드]

import sys
import heapq

n, m = map(int, sys.stdin.readline().split())

cards = []
card_list = list(map(int, sys.stdin.readline().split()))

for card in card_list:
    heapq.heappush(cards, card)
    
for _ in range(m):
    card1 = heapq.heappop(cards)
    card2 = heapq.heappop(cards)

    heapq.heappush(cards, card1 + card2)
    heapq.heappush(cards, card1 + card2)
print(sum(cards))

 

[sort 코드]

import sys

n, m = map(int, sys.stdin.readline().split())
cards = sorted(list(map(int, sys.stdin.readline().split())))
for _ in range(m):
    cards[0] = cards[1] = cards[0] + cards[1]
    cards = sorted(cards)
print(sum(cards))