프로그래머스_가장 먼 노드

윤승환·2022년 2월 11일
0

가장 먼 노드

문제 설명

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번 노드입니다.


concept

  • dp문제같다..! 1번에 연결된 3, 2는 1의 값을 3, 2에 연결된 6, 4, 5는 3, 2의 값 +1을 ... 전에 있던 노드의 정보를 가져온다..

  • dfs나 bfs로 탐색해서 진행하면 될 듯..?


code

  • bfs (시간초과)
from collections import deque
def solution(n, edge):
    answer = 0
    #거리 정보.
    distance = [0 for _ in range(n+1)]
    #그래프 정보.
    graph = [[0]*(n+1) for _ in range(n+1)]
    for s, t in edge:
        #무방향 그래프
        graph[s][t] = graph[t][s] = 1
    #bfs탐색 시작
    queue = deque()
    queue.append(1)
    while(queue):
        now = queue.popleft()
        for i in range(1, n+1):
            if(now == i):
                continue
            if(graph[now][i] != 0 and distance[i]==0):
                queue.append(i)
                distance[i] = distance[now] + 1
    distance[1] = 0
    answer = distance.count(max(distance))
    return answer
  • 간선정보이용
from collections import deque
def solution(n, edge):
    answer = 0
    #1번 노드에서 도달할 수 있는 거리
    distance = [0 for _ in range(n+1)]
    #queue사용.
    queue = deque()
    #그래프 연결 정보
    graph = [[]for _ in range(n+1)]
    edge.sort()
    for e in edge:
        #연결 되어 있는 정보를 리스트로 가져감
        graph[e[0]].append(e[1])
        graph[e[1]].append(e[0])
    #1번 노드부터 탐색
    queue.append(1)
    
    while queue:
        #큐에 가장 앞에 있는 원소를 가져온다.
        now = queue.popleft()
        #연결되어 있는 다음 노드들을 탐색
        for next in graph[now]:
            #1번 노드는 내가 미리 넣어줬으므로 탐색할 필요가 없다.
            if next == 1:
                continue
            #한번도 방문한 적 없는 노드라면 다시 그 지점부터 탐색해야하므로 삽입
            if(distance[next] == 0):
                queue.append(next)
                #다음 방문 거리는 현재 보다 한칸씩 더 증가해야 하므로..
                distance[next] = distance[now]+1
    
    answer = distance.count(max(distance))
    
    return answer

참고

  • 시간초과가 난 이유 = 연결된 노드들을 for문을 이용해 모두 확인하기 때문
  • 연결된 간선들을 확인하는 것으로 탐색 시간을 낮출 수 있다.
  • 효율적인 측면에서 그래프(배열)를 이용하는 것보다 간선의 정보로 탐색하는것이 효율적으로 보임

0개의 댓글