백준 온라인 저널, 우선순위 큐, 힙정렬, 그리디 알고리즘/14241번 : 슬라임 합치기(파이썬)
2021. 6. 30. 01:17ㆍ알고리즘/자료구조
728x90
반응형
문제
https://www.acmicpc.net/problem/14241
문제 정의
영선이와 효빈이는 슬라임을 합치는 게임을 하고 있다. 두 사람은 두 슬라임을 골라서 하나로 합쳐야 한다. 게임은 슬라임이 하나 남았을 때 끝난다.
모든 슬라임은 양수 크기를 가지고 있다. 두 슬라임 x와 y를 합쳤을 때, 합친 슬라임의 크기는 x+y가 된다. 또한, 슬라임을 합칠 때 마다 두 사람은 x*y 점수를 얻게 된다.
영선이와 효빈이가 얻을 수 있는 점수의 최댓값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 슬라임의 개수 N (2 ≤ N ≤ 100)이 주어진다.
둘째 줄에는 슬라임의 크기가 주어진다. 크기는 100보다 작거나 같은 자연수이다.
출력
첫째 줄에 영선이와 효빈이가 얻을 수 있는 점수의 최댓값을 출력한다.
예제 입력 1
2
3 4
예제 출력 1
12
예제 입력 2
3
2 2 2
예제 출력 2
12
접근 방법
1. 슬라임의 크기에 따라 최대 힙 정렬을 한 뒤, 두 개의 데이터를 뽑고 이를 주어진 식에 따라 계산한다.
2. 계산 후, 다시 최대 힙에 삽입한다.
3. 이를 반복하다 슬라임이 하나 남았을 때, 그 수를 출력한다.
코드
# 문제 : https://www.acmicpc.net/problem/14241
# 접근 방법
# 슬라임의 크기에 따라 최대 힙 정렬을 한 뒤, 두 개의 데이터를 뽑고 이를 주어진 식에 따라 계산한다.
# 계산 후, 다시 최대 힙에 삽입한다.
# 이를 반복하다 슬라임이 하나 남았을 때, 그 수를 출력한다.
# 시간복잡도 : O(logN)
import heapq, sys
input = sys.stdin.readline
n = int(input()) # 슬라임 개수 입력받기
slime = list(map(int, input().split())) # 슬라임 크기 입력받기
heap = []
for x in slime:
heapq.heappush(heap, -x) # 최대 힙 정렬
score = 0 # 점수 초기화
while len(heap) != 1: # 슬라임이 하나남을 때까지 반복
s1 = heapq.heappop(heap) # 가장 크기가 큰 슬라임 (음수)
s2 = heapq.heappop(heap) # 두번째로 크기가 큰 슬라임 (음수)
score += s1*s2 # 점수 계산, 음수 * 음수 = 양수
heapq.heappush(heap, (s1 + s2)) # 합친 슬라임 다시 삽입하기
print(score) # 점수 출력
- 시간 복잡도 측면에서 봤을 때, 데이터의 개수가 작기 때문에 힙 정렬을 하지 않고 리스트 정렬을 한 뒤에 문제를 풀어도 해결될 것 같다.
728x90
반응형
'알고리즘 > 자료구조' 카테고리의 다른 글
백준 온라인 저지, 자료구조/1202번: 보석도둑 (파이썬 / 백준 골드문제) (0) | 2021.08.29 |
---|---|
백준 온라인 저널, 우선순위 큐, 그리디 알고리즘/15903번 : 카드 합체 놀이(파이썬) (0) | 2021.06.30 |
백준 온라인 저널, 우선순위 큐, 자료구조/2075번 : N번째 큰 수(파이썬) / 백준 골드 문제 (0) | 2021.06.25 |
백준 온라인 저널, 우선순위 큐, 자료구조/11286번 : 절대값 힙(파이썬) (0) | 2021.06.25 |
백준 온라인 저널, 우선순위 큐, 자료구조, 정렬/11000번 : 강의실 배정(파이썬) / 백준 골드 문제 (0) | 2021.06.25 |