Input
첫째 줄에 유저의 수 N (2 ≤ N ≤ 100)과 친구 관계의 수 M (1 ≤ M ≤ 5,000)이 주어진다.
둘째 줄부터 M개의 줄에는 친구 관계가 주어진다. 친구 관계는 A와 B로 이루어져 있으며, A와 B가 친구라는 뜻이다. A와 B가 친구이면, B와 A도 친구이며, A와 B가 같은 경우는 없다. 친구 관계는 중복되어 들어올 수도 있으며, 친구가 한 명도 없는 사람은 없다. 또, 모든 사람은 친구 관계로 연결되어져 있다. 사람의 번호는 1부터 N까지이며, 두 사람이 같은 번호를 갖는 경우는 없다.
1 | n, m = map(int, input().split()) |
먼저 친구 관계 👉 트리 구조 이므로 adj
를 생성하고, bfs를 위해 visited
도 생성한다.
그리고, 답을 저장한 뒤 min
을 출력해야 하므로 answer
도 생성한다.
1 | adj = [[] for _ in range(n+1)] |
친구 관계를 저장할 adj에 입력값 저장!
1 | for _ in range(m): |
Default
1 | import sys |
BFS
연속적으로 이어진 값을 더해나가는 문제이기 때문에, 어제 배운 새로운 접근 방식에 따라 bfs 를 적용하여 queue 를 이용해 답을 구해봤다.
1 | def bfs(start): |
queue에 값이 존재하는 동안
- start 자신이 아니며, 아직 방문하지 않은 노드에 대해서
- queue에
append
하고+1
을 수행한다.
이 때,
pop
이 아니라popleft
임!!!
1 | while queue: |
Output
첫째 줄에 BOJ의 유저 중에서 케빈 베이컨의 수가 가장 작은 사람을 출력한다. 그런 사람이 여러 명일 경우에는 번호가 가장 작은 사람을 출력한다.
- 모든 n 사람에 대해서 bfs를 시행해야 하므로 for문을 돌리고,
- visited 값을 모두 더한 값이 케빈 베이컨의 값이므로 sum을 이용한다.
- 이후 visited를 다시 초기화시켜야 한다.
index
함수는 찾는 값의 index가 여러개일 경우 가장 첫번째 index를 반환하므로, 자동적으로 조건을 만족시킨다.
1 | for i in range(1, n+1): |