Skip to content

Commit bbbe3ad

Browse files
committed
[BOJ] 전생했더니 슬라임 연구자였던 건에 대하여 (Hard) / 골드 4 / 80분
https://www.acmicpc.net/problem/14698
1 parent acdbc45 commit bbbe3ad

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
'''
2+
요구사항
3+
1. A만큼의 에너지를 가진 슬라임과 B만큼의 에너지를 가진 슬라임을 합성하려면 A × B 만큼의 에너지 필요.
4+
2. N마리의 슬라임들을 적절히 합성해서 1마리의 슬라임으로 만들때, 필요한 에너지 값을 모두 곱한 값을 최소로 만든다.
5+
3. 슬라임을 모두 합성했을 때 청구될 비용의 최솟값을 1, 000, 000, 007로 나눈 나머지를 출력한다. 에너지가 전혀 필요하지 않은 경우엔 1 을 출력한다.
6+
7+
1. 아이디어
8+
곱의 누적곱이 최소가 되게 하려면 곱셈의 결과가 최소가 나오게 해야 함. 즉 큰 수를 가장 적게 곱하고
9+
되도록 작은수 X 작은수 형태로 풀이. 따라서 각 경우마다 가장 작은 두 수를 그리디하게 뽑아서 곱하고 누적곱해주면 된다.
10+
11+
2. 시간복잡도
12+
슬라임 수 N (1 ≤ N ≤ 60), i번째 슬라임의 에너지 Ci (2 ≤ Ci ≤ 2 × 1018)일때,
13+
모든 테스트 케이스에 대한 N 의 총합이 1, 000, 000을 넘지 않음으로 테스트 케이스의 수는 최대 500,000.
14+
즉 O(test_case * (N-1)) == O(500,000 * 59)로 만족.
15+
16+
3. 구현
17+
3-1. 입력받기
18+
3-2. N-1번 가장 작은 두 수를 뽑는다.
19+
3-3. 두 수를 곱하고 정답변수에 누적시킨다.
20+
3-4. 곱한 두 슬라임을 제거하고, 새 슬라임을 추가한다.
21+
3-5. 정답 출력
22+
23+
'''
24+
25+
26+
import heapq
27+
import sys
28+
29+
inp = sys.stdin.readline
30+
MOD = 1000000007
31+
32+
test_case = int(inp())
33+
34+
for _ in range(test_case):
35+
N = int(inp())
36+
arr = list(map(int, inp().split()))
37+
38+
if N == 1:
39+
print(1)
40+
continue
41+
42+
hq = []
43+
for num in arr:
44+
heapq.heappush(hq, num)
45+
46+
result = 1
47+
while len(hq) > 1:
48+
a = heapq.heappop(hq)
49+
b = heapq.heappop(hq)
50+
energy = a * b
51+
result = (result * energy) % MOD
52+
heapq.heappush(hq, energy)
53+
54+
print(result)

0 commit comments

Comments
 (0)