programmers.co.kr/learn/courses/30/lessons/49189
코딩테스트 연습 - 가장 먼 노드
6 [[3, 6], [4, 3], [3, 2], [1, 3], [1, 2], [2, 4], [5, 2]] 3
programmers.co.kr
해결방안
-
BFS 알고리즘
알고리즘
-
1에서 출발하여 각 거리에 있는 노드들을 고려하기 위한 딕셔너리 생성 (result_list)
- vertex를 그래프로 만들기 위한 딕셔너리 생성 (graph)
- edge를 돌면서 graph에 양방향 그래프 초기화
- 중복 방문을 방지하기 위해 방문여부를 처리하는 배열 생성 (visited)
- BFS 수행
- 1번노드를 큐에 넣고 방문처리, 시작점이므로 cnt는 0으로 초기화
- 큐에서 노드를 뽑아서, 방문안한 노드일 경우에만 방문처리하고 큐에 넣기
- 각 노드까지의 거리를 나타내는 result_list에 key값으로 현재 cnt에 +1을 설정하고 value로 현재의 노드번호 넣기
- 나중에 result_list돌면서 가장 먼 거리에 있는 노드들 얻기 위함
- 2번을 반복
- result_list를 n을 키로 가진것부터 0번째까지 역순으로 반복하며 key 값이 가장 클때의 리스트의 길이를 리턴
핵심 팁
- 문제를 이해하는 것이 중요
- 기본적인 BFS, DFS 문제
- DFS로 풀어도 가능
- BFS로 푸는것이 구현하기에 좀 더 쉬울것으로 예상했음
Python
from collections import deque
from collections import defaultdict
def solution(n, edge):
ans = 0
result_list = defaultdict(list)
graph = defaultdict(list)
for data in edge:
a, b = data
graph[a].append(b)
graph[b].append(a)
visited = [False] * (n + 1)
def bfs(start):
q = deque([(start, 0)])
visited[start] = True
while q:
now, cnt = q.popleft()
for i in graph[now]:
if visited[i] is False:
visited[i] = True
q.append((i, cnt + 1))
result_list[cnt + 1].append(i)
bfs(1)
for i in range(n, -1, -1):
if i in result_list and len(result_list[i]) > 0:
ans = len(result_list[i])
break
return ans
n = 6
vertex = [[3, 6], [4, 3], [3, 2], [1, 3], [1, 2], [2, 4], [5, 2]]
ans = solution(n, vertex)
print(ans)
*퍼가신다면 출처와 댓글 부탁드립니다.
*더 많은 자료는 아래 github에 있습니다
https://github.com/griffinGC/Algoritm_PS
'알고리즘' 카테고리의 다른 글
[프로그래머스 level2] 빛의 경로 사이클 (0) | 2021.09.17 |
---|---|
[백준 1003 실버3] 피보나치 함수 (0) | 2021.02.23 |
[프로그래머스 level1] 체육복 (0) | 2021.02.22 |