Coding Test/백준(Python)

[백준/Python] 13975번(그리디, 우선순위 큐)_ 파일 합치기3

syunze 2023. 8. 9. 16:53

📌문제 유형

그리디, 우선순위 큐 (골드 Lv.4)

 

📌문제

 

13975번: 파일 합치기 3

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

www.acmicpc.net

 

📌나의 문제풀이

- 우선순위 큐 적용한 것(정답)

import heapq

t = int(input())

for _ in range(t):
    ans = 0
    k = int(input())
    chap_nums = list(map(int,input().split()))
    heapq.heapify(chap_nums)

    while True:
        num1 = heapq.heappop(chap_nums)
        num2 = heapq.heappop(chap_nums)
        ans += (num1 + num2)
        heapq.heappush(chap_nums, num1 + num2)

        if len(chap_nums) == 1:
            break

    print(ans)

- 우선순위 큐 적용X (오답)

t = int(input())


for _ in range(t):
    ans = 0
    k = int(input())
    chap_nums = list(map(int,input().split()))

    while True:
        chap_nums.sort()
        num1 = chap_nums.pop(0)
        num2 = chap_nums.pop(0)
        ans += (num1 + num2)
        chap_nums.append(num1 + num2)

        if len(chap_nums) == 1:
            break

    print(ans)

 

📌 다른사람의 문제풀이

- 동일
 

[Python] 백준 13975 파일 합치기 3

1. 문제 링크 https://www.acmicpc.net/problem/13975 13975번: 파일 합치기 3 프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T개의 테스트 데이터로 이루어져 있는데, T는 입력의 맨 첫

ryu-e.tistory.com

import sys
import heapq

for _ in range(int(sys.stdin.readline())):
    k = int(sys.stdin.readline())
    arr = list(map(int, sys.stdin.readline().split()))
    heapq.heapify(arr)   # 최소힙
    result = 0
    # 가장 작은 2개의 파일 크기를 꺼내서 합친값을 다시 우선순위 큐에 넣기 
    while len(arr) >= 2:
        f = heapq.heappop(arr)
        s = heapq.heappop(arr)
        result += (f + s)
        heapq.heappush(arr, (f + s))
    print(result)

 

📌 리뷰

-입력 개수 꼭 확인하기! (장의 수 k가 1,000,000까지여서 시간 많이 소요되는걸 파악할 수 있음)

- 매번 정렬 + 작은 숫자가 나와야함 + 입력개수 큼 -> 우선순위 큐 적용하기 

- 우선순위 큐 정리 내용

 

[Python] Heap과 heapq 모듈

heap 에 대한 설명은 https://brownbears.tistory.com/391에서 했지만 여기서는 더 자세하게 설명을 합니다. Heap은 최댓값, 최솟값을 찾아내는 연산을 빠르게 하기 위해 고안되었으며 완전 이진 트리 (Complete

brownbears.tistory.com

 

728x90