백준 30892 - 상어 (파이썬)
글 작성자: pental
https://www.acmicpc.net/problem/30892
풀이
상어가 주어진 크기 T에서 시작하여, K번의 기회를 활용하여 먹이를 먹으며 성장하는 문제이다.
주어진 먹이 리스트 A에서 적절한 먹이를 선택해 T를 최대한 티키우는것이 목표이다.
즉, 그리디 알고리즘을 활용하여 해결할 수 있다. 먹이를 먹는 과정에서 가장 작은 먹이부터 차례로 선택하는 것이 유리하기 때문에 우선순위 큐를 활용한다.
for _ in range(K):
while pos < N and A[pos] < T:
pq.put(-A[pos])
pos += 1
A[pos]가 현재 T보다 작은 경우, 즉 먹을 수 있는 먹이를 pq에 넣는다.
pq.put(-A[pos])를 통해 최대 힙을 구현한다.
- 우선순위 큐는 기본적으로 최소 힙이므로 음수로 변환하여 최대 힙 처럼 사용하는 방식을 선택한다.
시간 복잡도 분석
- A.sort() → O(N log N)
- while pos < N → 최대 O(N)
- pq.put(), pq.get() → O(logN)
- K번 반복 → O(K Log N)
즉, 총 시간 복잡도는 O(N Log N + K Log N)으로 O(N Log N) 정도이다.
코드
# 백준 30892 - 상어 키우기
# 분류 : 그리디
from queue import PriorityQueue
N, K, T = map(int, input().split())
A = list(map(int, input().split()))
A.sort()
pq = PriorityQueue()
pos = 0
for _ in range(K) :
while pos < N and A[pos] < T :
pq.put(-A[pos])
pos += 1
if pq.qsize() == 0 :
break
T += -pq.get()
print(T)
'Programming > 백준' 카테고리의 다른 글
백준 17608 - 막대기 (파이썬) (0) | 2025.03.21 |
---|---|
백준 17286 - 유미 (파이썬) (0) | 2025.03.20 |
백준 31825 - 알파벳과 쿼리 (Easy) (0) | 2025.03.18 |
백준 31823 - 악질 검거 (파이썬) (0) | 2025.03.18 |
백준 16466 - 콘서트 (파이썬) (0) | 2025.03.17 |
댓글
이 글 공유하기
다른 글
-
백준 17608 - 막대기 (파이썬)
백준 17608 - 막대기 (파이썬)
2025.03.21 -
백준 17286 - 유미 (파이썬)
백준 17286 - 유미 (파이썬)
2025.03.20 -
백준 31825 - 알파벳과 쿼리 (Easy)
백준 31825 - 알파벳과 쿼리 (Easy)
2025.03.18 -
백준 31823 - 악질 검거 (파이썬)
백준 31823 - 악질 검거 (파이썬)
2025.03.18