728x90
🙈
https://www.acmicpc.net/problem/6118
6118번: 숨바꼭질
재서기는 수혀니와 교외 농장에서 숨바꼭질을 하고 있다. 농장에는 헛간이 많이 널려있고 재서기는 그 중에 하나에 숨어야 한다. 헛간의 개수는 N(2 <= N <= 20,000)개이며, 1 부터 샌다고 하자. 재
www.acmicpc.net
내 풀이
from collections import deque
def bfs(s):
q = deque()
q.append(s)
visited[s] = True
while q:
c = q.popleft()
for i in arr[c]:
if not visited[i]:
visited[i] = True
distance[i] = distance[c] + 1
q.append(i)
N, M = map(int, input().split())
arr = [[] for _ in range(N+1)]
visited = [False] * (N+1)
distance = [0] * (N+1)
for _ in range(M):
num1, num2 = map(int, input().split())
arr[num1].append(num2)
arr[num2].append(num1)
bfs(1) # 시작점
ans = max(distance) # 가장 먼 거리
print(distance.index(ans), ans, distance.count(ans))
bfs(너비 우선 탐색)로 풀었다.
코드 설명
인덱스를 직관적으로 사용하기 위해 리스트의 크기를 N+1로 설정하고 초기화했다.
arr: 각 헛간과 연결된 헛간의 번호를 저장하는 이차원 리스트
visited: 방문된 헛간인지 아닌지를 구별하는 리스트
distance: 1번 헛간에서의 거리를 저장하는 리스트
arr = [[] for _ in range(N+1)]
visited = [False] * (N+1)
distance = [0] * (N+1)
사용자에게 헛간 번호 2개를 입력받는다.
모든 헛간은 양방향 길로 이어져 있다. ➡ 서로의 헛간 리스트에 상대 헛간 번호를 저장한다.
for _ in range(M):
num1, num2 = map(int, input().split())
arr[num1].append(num2)
arr[num2].append(num1)
bfs를 호출한다.
1번 헛간부터 찾을 것이기 때문에 시작점인 1을 매개변수로 넘겨준다.
bfs(1) # 시작점
✔️ bfs 함수 내
해당 헛간과 연결되어 있는 모든 헛간들을 검사한다.
방문하지 않은 곳이라면 방문 처리를 한 후, 1번 헛간으로부터의 거리를 저장하고, q에 헛간 번호를 추가한다.
for i in arr[c]:
if not visited[i]:
visited[i] = True
distance[i] = distance[c] + 1
q.append(i)
'코딩테스트' 카테고리의 다른 글
[백준][Python] 10026 적록색약 (1) | 2024.03.08 |
---|---|
[백준][Python] 2583 영역 구하기 (1) | 2024.03.08 |
[백준][Python] 14940 쉬운 최단거리 (0) | 2024.03.06 |
[백준][Python] 1303 전쟁 - 전투 (2) | 2024.03.06 |
[백준][Python] 1743 음식물 피하기 (1) | 2024.03.06 |