DHistory

[Baekjoon] Greedy - 15903 카드 합체 놀이 본문

Computer Science/Algorithm

[Baekjoon] Greedy - 15903 카드 합체 놀이

ddu0422 2023. 8. 29. 11:00

문제

 

15903번: 카드 합체 놀이

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

www.acmicpc.net

 

풀이

"""
자연수 n장
i번 카드에는 ai가 쓰여있다.

카드 합체 과정
1. x번 카드와 y번 카드를 골라 두 장에 쓰여진 수를 더한 값을 계산한다. (x != y)
2. 계산한 값을 x번 카드와 y번 카드 두 장 모두 덮어 쓴다.

총 m번 하면 놀이가 종료된다.
m번 후 n장의 카드에 쓰여있는 수를 모두 더한 값이 이 놀이의 점수이다.
이 점수를 가작 작게 만드는 것이 놀이의 목표이다.

1 2 3 4

3 3 3 4
6 6 3 4
"""
import sys
import heapq

n, m = map(int, sys.stdin.readline().rstrip().split())
cards = list(map(int, sys.stdin.readline().rstrip().split()))[:n]


def solution(m, cards):
    queue = []

    for card in cards:
        heapq.heappush(queue, card)
    
    for _ in range(m):
        a, b = heapq.heappop(queue), heapq.heappop(queue)
        heapq.heappush(queue, a + b)
        heapq.heappush(queue, a + b)

    return sum(queue)


print(solution(m, cards))

 

채점 결과