728x90
반응형
문제링크
https://www.acmicpc.net/problem/14698
14698번: 전생했더니 슬라임 연구자였던 건에 대하여 (Hard)
각 테스트 케이스마다 슬라임을 끝까지 합성했을 때 청구될 비용의 최솟값을 1, 000, 000, 007로 나눈 나머지를 출력한다. 전기 에너지가 전혀 필요하지 않은 경우엔 1 을 출력한다.
www.acmicpc.net
1. 핵심
- 슬라임 합성 비용을 최소로 하기 위해서는 "작은" 슬라임들(이미 존재하는 슬라임과 새롭게 합성된 슬라임)부터 합성해야한다.
- 작은 슬라임을 뽑기 위해서 우선순위 큐(min heap)를 사용한다.
- MOD 에 대해서(시간초과 발생의 원인1) > MOD 문제 항상 주의!!
- 파이썬에서는 계속 곱하면 숫자가 끊임없이 커지게 되면서 시간복잡도가 매우 커지게 된다.
- 따라서 곱하거나 더할 때마다 MOD를 항상 적용하는게 필요하다.
- cost에 new_slime을 계속 곱하므로 cost에 MOD를 적용해서 숫자를 범위 내로 제한시켜야한다.
- 실수
- 뽑은 슬라임에 MOD를 적용한 것: 뽑은 슬라임에 MOD를 적용하고 합성하면 당연히 원하던 슬라임이 아닐 수밖에 없다.
- 새롭게 합성한 슬라임에 MOD를 적용한 것: 합성한 슬라임에 MOD를 적용하면 합성된 슬라임이 이상해지게 된다.
- 시간초과2
- 그냥 input만 사용하면 시간초과 발생한다. sys input을 사용하자
2-1. 코드(Python)
import sys
from heapq import heappop, heappush
input = sys.stdin.readline
MOD = 1000000007
def solution(slimes):
slimes.sort()
cost = 1
if len(slimes) == 1:
return 1
heap = []
for slime in slimes:
heappush(heap, slime)
while len(heap) != 1:
slime_1 = heappop(heap)
slime_2 = heappop(heap)
new_slime = slime_1 * slime_2
heappush(heap, new_slime)
# cost = (cost * new_slime) % mod
cost *= new_slime
cost %= MOD
return cost
t = int(input())
for _ in range(t):
n = int(input())
slimes = list(map(int, input().split()))
print(solution(slimes))
728x90
반응형
'PS > 백준' 카테고리의 다른 글
[누적합] 출석체크 (0) | 2024.04.01 |
---|---|
[그리디] 전구와 스위치(Python) (1) | 2024.02.18 |
[DP] 호텔(Python) (0) | 2024.02.16 |
[백준/BOJ] 4233번 - 가짜 소수 (Python) (0) | 2023.11.02 |
[백준/BOJ] 27172번 - 수 나누기 게임 (Python) (0) | 2023.10.28 |