[프로그래머스] 가장 먼 노드 - BFS/그래프
글 작성자: _rian
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/49189
문제
n개의 노드가 있는 그래프가 있습니다. 각 노드는 1부터 n까지 번호가 적혀있습니다. 1번 노드에서 가장 멀리 떨어진 노드의 갯수를 구하려고 합니다. 가장 멀리 떨어진 노드란 최단경로로 이동했을 때 간선의 개수가 가장 많은 노드들을 의미합니다.
노드의 개수 n, 간선에 대한 정보가 담긴 2차원 배열 vertex가 매개변수로 주어질 때, 1번 노드로부터 가장 멀리 떨어진 노드가 몇 개인지를 return 하도록 solution 함수를 작성해주세요.
제한 사항
- 노드의 개수 n은 2 이상 20,000 이하입니다.
- 간선은 양방향이며 총 1개 이상 50,000개 이하의 간선이 있습니다.
- vertex 배열 각 행 [a, b]는 a번 노드와 b번 노드 사이에 간선이 있다는 의미입니다.
예제의 그래프를 표현하면 아래 그림과 같고, 1번 노드에서 가장 멀리 떨어진 노드는 4,5,6번 노드입니다.
문제 풀이
BFS를 사용해야하는 전형적인 문제 같았습니다. 그런데 처음에 풀었던 방식은 테스트 케이스 7, 8, 9에서 시간초과가 납니다. 그 당시 아이디어와 코드는 아래와 같습니다.
Main Idea
- 인접행렬에 모든 노드들의 연결관계를 표시
- 1부터 BFS로 탐색하며 노드 방문에 몇번을 걸쳐왔는지 넣어줍니다. 큐의 내용은
[a, b]
의 형식이었는데, a는 노드의 번호, b는 level을 표현하고자 하려고 했습니다.
코드
from collections import deque
def solution(n, edge):
adj = [[0 for i in range(n)] for i in range(n)]
for e in edge:
a, b = e[0], e[1]
adj[a-1][b-1] = 1
adj[b-1][a-1] = 1
ch = [0 for i in range(n)]
max_depth = 0
res = []
q = deque()
# 초기화
q.append([0, 1])
level = 1
ch[0] = 1
while len(q) != 0:
tmp = q.popleft()
start, level = tmp[0], tmp[1]
ch[start] = 1
#print(start+1, level)
if max_depth < level:
#print("!!!", start+1, level)
max_depth = level
res = [start+1]
elif max_depth == level:
#print("here : ",start+1, level)
res.append(start+1)
#print(res)
for i in range(len(adj[start])):
if adj[start][i] == 1 and ch[i] == 0:
ch[i] = 1
q.append([i, level+1])
answer = len(res)
return answer
아마 인접행렬을 써서 그런 것 같습니다.. 인접 리스트로 바꾸어주니 잘 동작합니다.
from collections import deque
def solution(n, edge):
# 인접행렬!
adj = dict()
for e in edge:
a, b = e[0], e[1]
if a not in adj.keys():
adj[a] = [b]
else:
adj[a].append(b)
if b not in adj.keys():
adj[b] = [a]
else:
adj[b].append(a)
ch = [0 for i in range(n+1)] # visited 배열
q = deque()
#초기화
q.append([1, 1]) # [a, b] -> a는 현재 방문하고 있는 노드 ,b는 레벨
level = 1
ch[1] = 1
# 여기가 BFS 부분
while len(q) != 0:
tmp = q.popleft()
start, level = tmp[0], tmp[1]
if start not in adj.keys():
continue
for element in adj[start]:
if ch[element] == 0:
ch[element] = level+1
q.append([element, level+1])
answer = 0
for c in ch:
if c == max(ch):
answer += 1
return answer
'알고리즘 Algorithm > PS' 카테고리의 다른 글
[LeetCode] 542. 01 Matrix - BFS (0) | 2020.10.15 |
---|---|
[KickStart] Round F 2020 - ATM Queue (0) | 2020.09.29 |
[백준/BOJ] 4353. 문자열 제곱 (0) | 2020.09.29 |
[백준/BOJ] 4358. 생태학 (0) | 2020.09.29 |
[프로그래머스] 후보키 (python에서 pandas를 활용한 방법) (0) | 2020.09.15 |
댓글
이 글 공유하기
다른 글
-
[KickStart] Round F 2020 - ATM Queue
[KickStart] Round F 2020 - ATM Queue
2020.09.29 -
[백준/BOJ] 4353. 문자열 제곱
[백준/BOJ] 4353. 문자열 제곱
2020.09.29 -
[백준/BOJ] 4358. 생태학
[백준/BOJ] 4358. 생태학
2020.09.29 -
[프로그래머스] 후보키 (python에서 pandas를 활용한 방법)
[프로그래머스] 후보키 (python에서 pandas를 활용한 방법)
2020.09.15