[파이썬] 백준 15903번 카드 합체 놀이
작성:
백준 #15903 카드 합체 놀이
- 자연수 n장
- 두 카드를 골라 그 수를 더하고 고른 두 카드에 덮어쓴다.
- -> 덮어쓴다는 건 더한다는 게 아니다.
- x != y 라는 건 단순히 다른 카드를 고른다는 뜻이다.
- 결과 - 놀이가 끝난 후 n장의 카드 수를 모두 더한 값
- 출력: 만들 수 있는 가장 작은 점수
1. 틀린 풀이
- 최대 1000개의 카드, 최대 카드합체 15000회
- 그냥 매번 가장 작은 두 카드 더하는 식으로 해도 될듯했으나 안됨 (시간 초과)
n, m = map(int, input().split())
cards = list(map(int, input().split()))
for i in range(m):
min1 = min(cards)
midx1 = cards.index(min1)
min2 = float('inf')
midx2 = 0
for j in range(len(cards)):
if j != midx1 and cards[j] < min2:
min2 = cards[j]
midx2 = j
temp_res = min1 + min2
cards[midx1] = temp_res
cards[midx2] = temp_res
print(sum(cards))
2. 정답
- 모든 카드가 최소 힙을 이루게 하고,
그 중 가장 작은 두 카드를 뽑아 다시 힙에 넣었다.
from heapq import heappop, heappush
n, m = map(int, input().split())
raw_cards = list(map(int, input().split()))
cards = []
for card in raw_cards:
heappush(cards, card)
for i in range(m):
min1 = heappop(cards)
min2 = heappop(cards)
res = min1 + min2
for j in range(2):
heappush(cards, res)
print(sum(cards))
댓글남기기