Algorithm/acmicpc.net

난 외로울 때 힙합을 해.. (#1715)

winney916 2024. 10. 8. 00:40
728x90

 

#1715 카드 정렬하기 https://www.acmicpc.net/problem/1715

 

다음과 같이 사고했다.

테스트 케이스의 모든 경우의 수를 작성해본 결과, 작은 수의 카드 집합끼리 합치는게 최소값을 도출하는 방법이란걸 알 수 있었다.

 

 

음 좀 어려웠다. 처음 사고대로 구현했는데 시간초과가 났다.

 

틀린코드

from collections import deque

n = int(input())
nums = [int(input()) for _ in range(n)]
nums.sort()
nums = deque(nums)

answer = 0

while len(nums) >= 2:
    # print(answer, nums)
    tmp = nums.popleft() + nums.popleft()
    answer += tmp

    # insert nums
    for i in range(len(nums)):
        if nums[i] > tmp:
            nums.insert(i, tmp)

print(answer)

 

 

아무래도, 첫 sort부분에서 O(n)을 쓰고, insert부분에서 O(n) 혹은 그 이상을 쓴다.

 

 

문제 힌트를 통해서 "우선순위 큐"가 필요함을 알았다.

 

이 문제에서는 우선순위가 수의 크기였던 만큼, 별도의 구현은 필요하지 않았다. 

 

 

정답코드

import heapq

n = int(input())
nums = [int(input()) for _ in range(n)]
# nums.sort()
heapq.heapify(nums)
answer = 0

while len(nums) >= 2:
    # print(answer, nums)
    tmp = heapq.heappop(nums) + heapq.heappop(nums)
    answer += tmp

    # insert nums
    heapq.heappush(nums, tmp)

print(answer)

아주 심플하게 해결되는 골드문제라고 할 수 있다.

댓글수0