https://www.acmicpc.net/problem/3430
3430번: 용이 산다
옛날 아주 먼 옛날, 한 마을에 용이 살고 있었습니다. 그 마을에는 호수가 여러개 있었는데, 그 호수들은 모두 물이 들어 있었습니다. 이 마을에는 가끔 비가 내립니다. 신기하게도 비는 한 호수
www.acmicpc.net
백준 - 용이 산다 (Enter The Dragon) (3430번)
난이도 : Gold 1
알고리즘&자료구조 : 우선순위 큐 (Priority Queue) & 그리디 (Greedy)
시간복잡도 (Time Complexity) : O( nlogn )
★ 핵심 Idea ★
◎ 특정 호수 "x"에 시간 "t" 에서 비가 내렸다고 하면,
"t" 시점 전의 비가 오지 않은 날에는, "t"에서 내린 비를 먹을 수 없다.
따라서 시점 0부터 하루씩 탐색하면서,
현재 시점에서 각 호수 별로, 해당 호수에 비가 내리는 가장 가까운 미래 시점을 우선순위 큐에 넣어준다.
< 전체 코드 >
import sys
input = sys.stdin.readline
from heapq import heappop, heappush
class Ardenia():
def __init__(self, n, m):
pq = []
lake_idx = [[] for _ in range(n+1)]
query = list(map(int, input().split()))
is_full = [True] * (n+1)
for i in range(m-1, -1, -1):
lake_idx[query[i]].append(i)
for i in range(1, n+1):
if lake_idx[i]:
heappush(pq, lake_idx[i].pop())
is_poss = 'YES'
suck_up = []
for lake in query:
if not lake:
if pq:
i = heappop(pq)
suck_up.append(query[i])
is_full[query[i]] = False
else:
suck_up.append(0)
else:
if is_full[lake]:
is_poss = 'NO'
break
is_full[lake] = True
if lake_idx[lake]:
heappush(pq, lake_idx[lake].pop())
self.result = (is_poss, suck_up)
if __name__ == '__main__':
T = int(input())
for _ in range(T):
village = Ardenia(*map(int, input().split()))
print(village.result[0])
if village.result[0] == 'YES':
print(*village.result[1])
'Algorithm' 카테고리의 다른 글
인터넷 설치 (1800번) - 백준 (BOJ) (0) | 2023.09.12 |
---|---|
소용돌이 예쁘게 출력하기 (1022번) - 백준 (BOJ) (0) | 2023.09.11 |
문자판 (2186번) - 백준 (BOJ) (0) | 2023.09.09 |
비드맨 (19590번) - 백준 (BOJ) (0) | 2023.09.07 |
벽 부수고 이동하기 4 (16946번) - 백준 (BOJ) (1) | 2023.09.06 |