[프로그래머스] 가장 먼 노드

김영현·5일 전
0

프로그래머스

목록 보기
29/29
post-thumbnail

🌭 문제 설명

  • n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다.

  • 처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한 명만 심사를 할 수 있습니다. 가장 앞에 서 있는 사람은 비어 있는 심사대로 가서 심사를 받을 수 있습니다. 하지만 더 빨리 끝나는 심사대가 있으면 기다렸다가 그곳으로 가서 심사를 받을 수도 있습니다.

  • 모든 사람이 심사를 받는데 걸리는 시간을 최소로 하고 싶습니다.

  • 입국심사를 기다리는 사람 수 n, 각 심사관이 한 명을 심사하는데 걸리는 시간이 담긴 배열 times가 매개변수로 주어질 때, 모든 사람이 심사를 받는데 걸리는 시간의 최솟값을 return 하도록 solution 함수를 작성해주세요.


🍗 제한 사항

  • 노드의 개수 n은 2 이상 20,000 이하입니다.
  • 간선은 양방향이며 총 1개 이상 50,000개 이하의 간선이 있습니다.
  • vertex 배열 각 행 [a, b]는 a번 노드와 b번 노드 사이에 간선이 있다는 의미입니다.

🎁 입출력 예시

  • 예제의 그래프를 표현하면 아래 그림과 같고, 1번 노드에서 가장 멀리 떨어진 노드는 4,5,6번 노드입니다.

😎 나의 풀이

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
  1. bfs를 이용한 풀이다.
  2. deque와 인접리스트를 초기화 해준다.
  3. queue를 돌면서 연결 노드를 탐색하고 방문 하지 않았다면 큐에 추가 후 visitTrue로 업데이트 해주고 최단거리를 업데이트 시켜준다.
  4. 최단거리 리스트인 dist를 순회하여 가장 멀리 있는 거리값과 같으면 그 값의 노드를 세서 answer에 더해주면 된다.

  • dist의 거리값을 세서 리턴해주는게 핵심인 것 같다.
profile
학생의 자세로 살아가는 개발자

0개의 댓글