백준 15903번
https://www.acmicpc.net/problem/15903
문제
후기
카드를 리스트로 받은 후 우선 오름차순으로 정렬한다.
점수를 가장 작게 만드려면, 가장 작은 수 두 장을 합치는 것이 당연히 값이 가장 작게
나올 것이라 생각했다.
작은 카드 두장을 합치고, 그 카드 두장의 합을 다시 합치기전의 두 카드에 넣는다.
그 후에 카드를 정렬하는 과정을 M번 만큼 반복한다.
이렇게 반복하고 나서 만들어진 카드들의 list의 sum을 구하면 되는 비교적 간단한 문제다.
문제의 힌트에는 우선순위 큐를 사용하면 풀 수 있게 되어있지만, 익숙한 방법으로 쉽게 해결할 수
있었기에 아래와 같은 코드를 사용하였다.
나의 풀이
import sys
input = sys.stdin.readline
N , M = map(int,input().split()) # N은 카드개수 M은 합체횟수
# x번 카드와 y번 카드를 골라 그 두 장에 쓰여진 수를 더한 값을 계산한다. (x ≠ y)
# 계산한 값을 x번 카드와 y번 카드 두 장 모두에 덮어 쓴다.
# 점수를 가장 작게 만든다. M번 놀이 한 이후
card = sorted(list(map(int,input().split()))) # 카드 상태
cnt = 0 # M번이 될때까지 while문 반복예정
while cnt != M:
card_sum = 0 #제일 작은 카드 두장을 합칠 값
card.sort()
card_sum += card[0] + card[1]
card[0] = card_sum
card[1] = card_sum
cnt +=1
print(sum(card))