공부 기록장

백준 13975. 파일 합치기 3 본문

코딩 테스트/백준 문제 풀이

백준 13975. 파일 합치기 3

빛나무 2024. 1. 22. 16:45

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

 

13975번: 파일 합치기 3

프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T개의 테스트 데이터로 이루어져 있는데, T는 입력의 맨 첫 줄에 주어진다.각 테스트 데이터는 두 개의 행으로 주어지는데,

www.acmicpc.net

 

코드

import heapq
import sys
input = sys.stdin.readline

t = int(input())
for _ in range(t):
    k = int(input())
    num = list(map(int, input().split()))
    heap = []
    total = 0

    for n in num:
        heapq.heappush(heap, n)

    while True:
        if len(heap) == 1:
            break
        a = heapq.heappop(heap)
        b = heapq.heappop(heap)
        s = a + b
        total += s
        heapq.heappush(heap, s)

    print(total)

 

문제를 읽고 어떻게 해야

필요한 비용을 최소로 할 수 있을 지에 대한

고민이 좀 길었던 것 같다.

 

주어진 문제 예시의 첫 번째 테스트 케이스를 보면서

오름차순 정렬 후에 가장 큰 수와 작은 수를 더해주면 되나 싶었지만,

근거 없는 추측이었고 해답도 아니었다.

 

주어진 예시를 보면서 다시 생각해 보니까

비용이 최소가 되기 위해서는

더해지는 비용들이 최소가 되어야 하는데

더해지는 비용이 최소가 되기 위해서는

파일을 합칠 때마다 최소 비용이 드는 합치기를 수행해야 했다.

 

따라서 생각한 해법은

가장 작은 2개의 수를 합치고

그 합친 값을 다시 숫자 리스트에 넣어서

정렬을 하고 또 가장 작은 2개의 수를 합치고...

이 과정을 반복하면 되는 것이었다.

 

수행 속도를 고려해 heapq를 사용했다.

백준에서 채점 속도가 매우 느렸지만 통과는 됐다.

 

'코딩 테스트 > 백준 문제 풀이' 카테고리의 다른 글

백준 2812. 크게 만들기  (0) 2024.01.23
백준 2138. 전구와 스위치  (0) 2024.01.22
백준 12904. A와 B  (0) 2024.01.20
백준 1461. 도서관  (0) 2024.01.20
[백준 - Python] 1987. 알파벳 (DFS/BFS)  (0) 2024.01.20