일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 파이썬
- 4기
- P Stage
- 프로그래머스
- AI Tech 4기
- Naver boostcourse
- 장고
- 부스트캠프
- 서블릿
- 백준
- Naver boostcamp
- Django
- QNA 봇
- 레벨2
- 웹 프로그래밍
- 서버
- 풀스택
- sts
- Customer service 구현
- 네이버
- 웹
- 구현
- BOJ
- 백엔드
- boostcourse
- 프로그래밍
- AI Tech
- 대회
- 2021 Dev-matching 웹 백엔드 개발자
- cs50
- Today
- Total
daniel7481의 개발일지
[BOJ] 14698 전생했더니 슬라임 연구자였던 건에 대하여(hard) 본문
문제
안녕? 내 이름은 ntopia!
나는 원래 지구에 살고 있던 평범한 20대 청년이었어. 어느 날 길을 걷다가 괴한의 칼에 찔려 죽어버렸어. 그런데 이게 무슨 일이람! 정신을 차려보니 이세계에 떨어져 버렸지 뭐야. 여기에서 나는 슬라임을 전문으로 연구하는 슬라임 연구자가 되어버린 것 같아. 나는 지금 아주 중요한 연구를 진행하고 있어. 이 연구가 성공하면 나는 내가 살던 세계로 돌아갈 수 있게 될 거야. 이 연구를 도와주지 않겠니?
이곳의 슬라임은 모두 슬라임 에너지라는 것을 갖고 있고 그 양은 2 이상의 자연수로 표현돼. 나는 슬라임을 합성했을 때 슬라임 에너지가 어떻게 변화하는지에 대해 연구하고 있어.
슬라임 합성 과정은 2마리를 합성해서 1마리를 만들어내는 식으로 이루어져. A만큼의 슬라임 에너지를 가진 슬라임과 B만큼의 슬라임 에너지를 갖고 있는 슬라임이 있었다고 해보자. 이 슬라임 2마리를 합성하면 슬라임 에너지가 A × B 인 슬라임을 만들 수 있어.
그리고 슬라임 합성 기술이 아직 완벽하지 않아서 슬라임을 합성할 때마다 크나큰 전기 에너지가 필요해. 구체적으로, A만큼의 슬라임 에너지를 가진 슬라임과 B만큼의 슬라임 에너지를 가진 슬라임을 합성하려면 A × B 만큼의 전기 에너지가 필요해.
에너지가 4인 슬라임과 에너지가 6인 슬라임을 합성한 모습. 4 × 6의 전기 에너지를 사용해 슬라임 에너지가 24인 슬라임이 합성되었다.
나에겐 지금 N마리의 슬라임이 있어. 이 슬라임들을 모두 적절히 합성해서 1마리의 슬라임으로 만들려고 해. 그런데 내가 소속된 연구소에서 각 합성 단계마다 필요한 전기 에너지들을 모두 곱한 값을 나에게 비용으로 청구하겠다고 했지 뭐야. 그래서 이 값이 최소가 되도록 합성을 적절히 수행하는 것이 내 연구의 목표야.
내 연구를 도와줘! 부탁이야!!
입력
첫 번째 줄에 테스트 케이스의 수 T 가 주어지고, 이어서 T 개의 테스트 케이스가 주어진다.
각 테스트 케이스의 첫 번째 줄에는 슬라임의 수 N (1 ≤ N ≤ 60)이 주어지고, 두 번째 줄에는 N 개의 자연수가 주어진다. i번째 자연수 Ci (2 ≤ Ci ≤ 2 × 1018) 는 i번째 슬라임의 슬라임 에너지를 나타낸다. 끝까지 합성하고 난 후에 생기는 슬라임의 에너지의 양이 2 × 1018 이하라는 것이 보장된다.
모든 테스트 케이스에 대한 N 의 총합이 1, 000, 000을 넘지 않음이 보장된다.
출력
각 테스트 케이스마다 슬라임을 끝까지 합성했을 때 청구될 비용의 최솟값을 1, 000, 000, 007로 나눈 나머지를 출력한다. 전기 에너지가 전혀 필요하지 않은 경우엔 1 을 출력한다.
풀이
본의 아니게 랜덤 문제를 돌리다가 이런 오타쿠스러운 제목을 보게 되었고, 마음에 들어 바로 풀게 되었다. 옛날에 이와 비슷한 문제를 풀었던 것 같은데, 무슨 카드 뒤집는 문제였던 걸로 기억한다. 다행히 문제를 푸는 방법이 기억났고, heap 자료구조를 사용하여 풀 수 있었다. 로직은 최소한의 비용이 들려면 매 순간마다 제일 작은 두개의 슬라임을 곱해줘야한다. 최소힙을 사용하여 매 순간마다 제일 작은 슬라임 두 마리를 꺼낸 후 곱해주고, 곱해준 값을 에너지에 곱해준 후, 둘을 곱한 값을 다시 힙에 넣어주었다. 이 과정을 슬라임이 한 마리만 남을 때까지 반복하였다.
import sys
import heapq
input = lambda: sys.stdin.readline().rstrip()
t = int(input())
for _ in range(t):
n= int(input())
slime = list(map(int, input().split()))
energy = 1
heapq.heapify(slime)
while len(slime) > 1:
a = heapq.heappop(slime)
b = heapq.heappop(slime)
energy *= a*b
heapq.heappush(slime, a*b)
if energy == 0:
print(1)
else:
print(energy%1000000007)
'BOJ' 카테고리의 다른 글
[BOJ] 24336 가희와 무궁화호 (0) | 2022.01.26 |
---|---|
[BOJ] 2987 사과나무 (0) | 2022.01.22 |
[BOJ] 19236 청소년 상어 (0) | 2021.12.24 |
[BOJ] 17140 이차원 배열과 연산 (0) | 2021.12.24 |
[BOJ] 17616 등수 찾기 (0) | 2021.12.17 |