[Programmers/Python] Graph - 가장 먼 노드

Frye 'de Bacon·2023년 11월 8일
0

코딩테스트

목록 보기
18/45
post-custom-banner

Programmers - 가장 먼 노드


문제

n개의 노드가 있는 그래프가 있습니다. 각 노드는 1부터 n까지 번호가 적혀있습니다. 1번 노드에서 가장 멀리 떨어진 노드의 갯수를 구하려고 합니다. 가장 멀리 떨어진 노드란 최단경로로 이동했을 때 간선의 개수가 가장 많은 노드들을 의미합니다.

노드의 개수 n, 간선에 대한 정보가 담긴 2차원 배열 vertex가 매개변수로 주어질 때, 1번 노드로부터 가장 멀리 떨어진 노드가 몇 개인지를 return 하도록 solution 함수를 작성해주세요.

제한사항

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

입출력 예

nvertexreturn
6[[3, 6], [4, 3], [3, 2], [1, 3], [1, 2], [2, 4], [5, 2]]3

입출력 예 설명

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


풀이

설계

  1. BFS를 이용한 완전탐색 문제로 접근
  2. vertex를 오름차순으로 정렬하고 인접 리스트 방식으로 그래프 구현
  3. n+1만큼(0번 노드까지 고려) 0으로 채운 리스트(distance)를 선언
  4. 큐에 첫 번째로 방문할 노드 번호 1을 삽입
  5. 큐에서 요소를 하나 추출하여 그래프에서 해당 노드에 연결된 노드 정보를 가져온다.
  6. 각 노드별로 방문 여부(distance의 값이 0이라면 방문하지 않은 상태)를 확인한 후 방문한 적이 없다면 해당 노드를 큐에 추가하고
    해당 노드에 해당하는 distance의 값을 현재 노드의 값에 1을 더한 값으로 변경한다.
  7. 이 과정을 연결된 큐가 빌 때까지 반복한다.
  8. 모든 노드를 방문했다면, distance에서 최댓값을 찾은 후, 해당 최댓값과 동일한 개수만큼을 answer에 저장하여 반환한다.

코드

from collections import deque

def solution(n, edge):
    edge = sorted(edge)  # [[1, 2], [1, 3], [2, 4], [3, 2], [3, 6], [4, 3], [5, 2]]
    distance = [0] * (n+1) # 각 노드별로 노드 1부터의 거리
    queue = deque()
    graph = [[] for _ in range(n+1)]
    answer = 0

    for i in edge:  # 인접 리스트 방식으로 그래프 구현
        graph[i[0]].append(i[1])
        graph[i[1]].append(i[0])

    queue.append(1)  # 큐에 첫 번째로 방문할 노드 번호를 추가
    distance[1]=1  # 방문한 노드의 거리를 1로 설정

    while queue:
        current = queue.popleft()
        for node in graph[current]:
            if distance[node] == 0:  # 방문 여부를 확인하고, 방문한 적이 없는 경우
                queue.append(node)  # 노드를 큐에 추가
                distance[node] = distance[current] + 1  # 해당 노드의 값을 현재 노드의 값에 1을 더한 값으로 변경

    max_distance = max(distance)  # distance에서 최댓값을 찾은 후 해당 값과 동일한 요소의 개수만큼 answer에 더한다.
    for j in distance:
        if j == max_distance:
            answer += 1
    return answer
profile
AI, NLP, Data analysis로 나아가고자 하는 개발자 지망생
post-custom-banner

0개의 댓글