n
명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다.
처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한 명만 심사를 할 수 있습니다. 가장 앞에 서 있는 사람은 비어 있는 심사대로 가서 심사를 받을 수 있습니다. 하지만 더 빨리 끝나는 심사대가 있으면 기다렸다가 그곳으로 가서 심사를 받을 수도 있습니다.
모든 사람이 심사를 받는데 걸리는 시간을 최소로 하고 싶습니다.
입국심사를 기다리는 사람 수 n
, 각 심사관이 한 명을 심사하는데 걸리는 시간이 담긴 배열 times
가 매개변수로 주어질 때, 모든 사람이 심사를 받는데 걸리는 시간의 최솟값을 return 하도록 solution 함수를 작성해주세요.
from collections import deque
def solution(n, edge): # 6,[[3, 6], [4, 3], [3, 2], [1, 3], [1, 2], [2, 4], [5, 2]]
answer = 0 # 답을 저장할 answer
graph = [[] for _ in range(n)] # 연결된 노드 정보 그래프
dist = [-1] * n # 각 노드의 최단 거리 리스트
for e in edge: # 인접 노드 정보 추가
graph[e[0] - 1].append(e[1] - 1)
graph[e[1] - 1].append(e[0] - 1)
visit = [False] * n # 방문 배열 초기화
queue = deque([0]) # 큐 생성 인덱스 0번으로
dist[1] = 0 # 자기 자신의 거리는 0으로 설정
visit[0] = True # 자기 자신 방문 True
while queue:
u = queue.popleft() # 현재 노드꺼내기
for v in graph[u]: # 연결 노드 탐색
if not visit[v]: # 방문하지 않았다면
queue.append(v) # 큐에 추가
visit[v] = True # 방문 표시
dist[v] = dist[u] + 1 # 최단거리 업데이트 (v까지 가는 거리는 현재 u까지 온 거리 + 1)
for d in dist: # BFS 결과로 만들어진 각 노드의 거리 값 하나씩 확인
if d == max(dist): # 가장 멀리 있는 거리값과 같다면 (= 가장 먼 노드라면)
answer += 1 # 그런 값의 노드를 세서 answer에 더한다.
return answer
bfs
를 이용한 풀이다.deque
와 인접리스트를 초기화 해준다.queue
를 돌면서 연결 노드를 탐색하고 방문 하지 않았다면 큐에 추가 후 visit
을 True
로 업데이트 해주고 최단거리를 업데이트 시켜준다.dist
를 순회하여 가장 멀리 있는 거리값과 같으면 그 값의 노드를 세서 answer
에 더해주면 된다.
dist
의 거리값을 세서 리턴해주는게 핵심인 것 같다.