[백준] 18352 특정 거리의 도시 찾기
dfs / 파이썬
[문제]
모든 도로의 거리가 1로 동일하므로 bfs를 사용하는 문제임을 알 수 있음
입력값) n: 도시의 개수 m: 도로의 개수 k: 거리정보 x: 출발 도시의 번호
노드와 간선정보가 인접 행렬방식과 인접 리스트방식중 인접 리스트 방식으로 입력됨을 확인하고 넘어가자
[과정]
1. bfs를 돌리기에 앞서 필요한 배열과 정보들을 저장
1.1) graph: 인접 리스트 방식으로 해당노드(graph[a])에 연결된 노드와 간선정보를 저장(.append(b,1))
1.2) visited: 노드의 방문여부를 담은 배열
1.3) distance: 특정 노드(start)에서 해당 노드까지 가는 거리비용을 담은 배열
2. start(시작노드)에서 bfs 실행
2.1) deque를 선언 후 시작노드를 큐에 저장
2.2) 해당노드를 방문처리한 후 while문으로 큐를 돌림
2.3) 큐를 하나 pop한 후 방문여부를 검사하고 방문되지 않은 노드이면 거리비용(distance)를 갱신 후 큐에 해당 노드를 넣어주고 방문처리
3. 최단거리가 k인 도시의 번호를 오름차순으로 출력
3.1) 조건에 맞는 도시가 존재하지 않을경우 -1 출력
[소스코드]
# 특정 거리의 도시 찾기
from collections import deque
def bfs(graph, start, visited):
queue = deque()
queue.append(start)
visited[start] = True
while queue:
node = queue.popleft()
for now, dist in graph[node]:
if not visited[now]:
distance[now] = distance[node]+dist
queue.append(now)
visited[now] = True
return graph
# 그래프의 기본정보 저장
n,m,k,x = map(int, input().split())
graph = [[] for _ in range(n+1)]
for i in range(m):
a,b = map(int, input().split())
# 노드, 간선
graph[a].append((b,1))
visited = [False] * (n+1)
distance = [0] * (n+1)
bfs(graph, x, visited)
# 최단거리가 k인 도시의 번호 출력
answer = []
for idx, dist in enumerate(distance):
if dist == k:
answer.append(idx)
if not answer:
print(-1)
else:
answer.sort()
for ans in answer:
print(ans)
[통과]
초반 2개는 bfs만 돌리고 3번작업을 안해주고 바로 제출해서 틀림
이후 5개는 출력부분이 틀렸나 계속해보다가 distance배열과 visited배열의 초기상태를 도시의 개수(n)만큼 해야하는데 간선의 개수(m)만큼 돌려서 인덱스 에러가 남
마지막에 해당 부분만 m->n으로 고치고 통과! (한참찾았네ㅎㅎ..)
'코딩테스트 문제풀이 > beakjoon' 카테고리의 다른 글
[백준] 11718 그대로 출력하기 (0) | 2021.08.05 |
---|---|
[백준] 11725 트리의 부모 찾기 (0) | 2021.08.05 |
[백준] 1439 뒤집기 (0) | 2021.04.04 |
[백준] 13305 주유소 (2) | 2021.02.10 |
[백준] 1541 잃어버린 괄호 (0) | 2021.02.10 |
댓글