백준 1715 파이썬

임규성·2023년 2월 1일
0
post-custom-banner

문제 설명

->링크 <-
난이도 골드4!!

해결 방법

사실 처음에는 문제를 잘못이해하고 내가 틀렸는데 코드가 틀렸다고 착각했다. 나는 이문제를 예를 들어 10 20 30 40카드가 있다면
10과 20의 카드를 비교하면 더이상 이둘을 비교할 필요가 없어서
계차수열식으로

10 + 20 = 처음 합친카드1
10 + 20(처음 합친 카드) + 30
10 + 20 + 30(두번째로 합친 카드) + 40

이런식으로 만 하면되므로 작은 순으로 정렬후 순서대로 누적해가면 풀릴 줄 알앗지만 그게 아니었다.
10과 20을 합치면
30 30 40 카드가 생겨서 이 3개중 제일 작은 2개를 반복해서 뽑아줘야됐다. 그러다가 더이상 합칠카드가 안나오면 되는 것였다.

그래서 최종해결 방법은

  1. 임의의 우선순위큐를 만들어서 카드의 장 수가 작은 2개를 뽑아내서
    비교하고
  2. 그때 비교한 장수를 result에 축적해둔다

해답 코드

import sys
import heapq
input = sys.stdin.readline

N = int(input().rstrip())

heap = []
for _ in range(N):
  heapq.heappush(heap, int(input().rstrip()))

if N == 1:
  res = 0
else:
  res = 0
  while len(heap) > 1:
    first =  heapq.heappop(heap)
    second = heapq.heappop(heap)
    res += first + second
    heapq.heappush(heap, first+second)

print(res)

다른사람의 코드를 보고난 후

사실 첫번째 오해한 방법이 무조건 맞다고 고집해서 다른사람의 코드를 보고 문제를 잘못이해한 점을 알아버렸다. 문제에서 준대로 그대로 해석하는게 문제를 제대로 이해하는게 중요하다는 것을 다시한번 알았다!!!

profile
삶의 질을 높여주는 개발자
post-custom-banner

0개의 댓글