n개의 노드가 있는 그래프가 있습니다. 각 노드는 1부터 n까지 번호가 적혀있습니다. 1번 노드에서 가장 멀리 떨어진 노드의 갯수를 구하려고 합니다. 가장 멀리 떨어진 노드란 최단경로로 이동했을 때 간선의 개수가 가장 많은 노드들을 의미합니다.
노드의 개수 n, 간선에 대한 정보가 담긴 2차원 배열 vertex가 매개변수로 주어질 때, 1번 노드로부터 가장 멀리 떨어진 노드가 몇 개인지를 return 하도록 solution 함수를 작성해주세요.
n | vertex | return |
---|---|---|
6 | [[3, 6], [4, 3], [3, 2], [1, 3], [1, 2], [2, 4], [5, 2]] | 3 |
예제의 그래프를 표현하면 아래 그림과 같고, 1번 노드에서 가장 멀리 떨어진 노드는 4,5,6번 노드입니다.
import heapq
def solution(n, edge):
node = [[] for _ in range(n+1)]
for x, y in edge:
node[x].append(y)
node[y].append(x)
dist = [0 for _ in range(n+1)]
visited = [False for _ in range(n+1)]
visited[0] = True
visited[1] = True
heap = []
heapq.heappush(heap, [0, 1])
while False in visited:
d, now = heapq.heappop(heap)
for next in node[now]:
cnt = d + 1
if visited[next] == False:
visited[next] = True
dist[next] = cnt
heapq.heappush(heap, [cnt, next])
dist = list(filter(lambda x : x == max(dist), dist))
return len(dist)
step 1
node = [[] for _ in range(n+1)]
for x, y in edge:
node[x].append(y)
node[y].append(x)
visited = [False for _ in range(n+1)]
visited[0] = True
visited[1] = True
heap = []
heapq.heappush(heap, [0, 1])
location
: 노드간의 연결관계 기록0: [[],
1: [3, 2],
2: [3, 1, 4, 5],
3: [6, 4, 2, 1],
4: [3, 2],
5: [2],
6: [3]]
dist
: 노드 최단거리 기록
visited
: 노드 방문기록
visited[0]
: 노드 위치 기록을 위해 생긴 dummy node - 무한반복방지 default = Truevisited[1]
: 1번 노드는 항상 시작점 = True
heap
: 현재 노드 위치, 거리 기록
- 거리 0 인 1에서 항상 시작
step 2
while False in visited:
d, now = heapq.heappop(heap)
for next in node[now]:
cnt = d + 1
if visited[next] == False:
visited[next] = True
dist[next] = cnt
heapq.heappush(heap, [cnt, next])
while False in visited:
: 모든 노드가 방문되었을 때 종료✅ 노드를 방문했을 때 :
d + 1
거리 기록- 방문 기록
❗ 양방향 관계임으로 방문 기록을 안하면 무한루프에 걸린다
step 3
dist = list(filter(lambda x : x == max(dist), dist))
return len(dist)
filter & max()
: dist 배열에서 최대값과 동일한 값만 반환answer = filter된 배열의 길이
🚩💪 : 처음으로 아무런 도움 없이 혼자 성공한 다익스트라 풀이 (뿌듯 & 자랑)