그래프탐색 BFS | BOJ 백준 14940번 쉬운 최단거리 | Python

Table of Contents



BOJ 백준 14940번 쉬운 최단거리 | Python

📌 백준 14940번 문제 바로가기

🔎 문제 설명

🩶 실버 1

- 난이도 ★☆☆☆
- 그래프탐색

최단거리를 구하는 방법엔 다양한 알고리즘이 있지만, 역시 난 가장 익숙한 BFS로 풀었다.

이 문제는 최단거리 찾는 유형 중 기본 유형에 속한다. 방문여부를 저장하는 visited 에 거리를 함께 저장했다. 백준 특정 거리의 도시 찾기 문제와 상당히 유사하다. 이전에 접했던 문제라면 역시 어렵지 않다.


📌 문제 풀이 큰 틀

  • 2 찾아서 시작점 위치 찾기
  • BFS로 가장 가까운 노드부터 최단거리를 계산
  • visited 에 거리를 1씩 더해 ‘첫 도시 ~ 현재 도시’의 거리를 계산



💻 내 코드

import sys
from collections import deque
input = sys.stdin.readline

n, m = map(int, input().split())
goal = (-1,-1)
graph = []
for i in range(n):
    tmp = list(map(int, input().split()))
    graph.append(tmp)
    if 2 in tmp:
        goal = (i, tmp.index(2))

# 0은 갈 수 없는 땅, 1은 갈 수 있는 땅, 2는 목표지점
def bfs(goal):
    visited = [[-1 for _ in range(m)] for _ in range(n)]
    dx = [0,0,1,-1]
    dy = [1,-1,0,0]
    
    queue = deque([goal])
    x, y = goal
    visited[x][y] = 0
    while queue:
        x, y = queue.popleft()
        for i in range(4):
            nx, ny = x + dx[i], y + dy[i]
            if 0<=nx<n and 0<=ny<m:
                if not graph[nx][ny]:
                    # graph 값이 0이면 visited 값을 0으로 바꿔줌
                    visited[nx][ny] = 0 
                elif graph[nx][ny] == 1 and visited[nx][ny] == -1:
                    visited[nx][ny] = visited[x][y] + 1
                    queue.append((nx,ny))
    return visited

visited = bfs(goal)

# 첫 번째 출력 시도 -> 틀림
# for i in range(n):
#     print(*visited[i])

# 두 번째 출력 시도 -> 맞음
for i in range(n):
    for j in range(m):
        if graph[i][j] == 0:
            print(0, end = ' ')
        else:
            print(visited[i][j], end = ' ')
    print()


🤷‍♀️ 예외 케이스?

사실 첫 번째 출력 시도로 했을 때 예외가 생기는 케이스를 아직 찾진 못했다. 혹시 이 글을 접하는 코딩 고수님이 있다면 질문 게시판/(예외케이스) 마지막 출력문을 살짝 바꾸면 … 에 답변 부탁드립니다 🙇‍♀️

2024.05.16 기준 코딩 고수님의 댓글을 확인했다! 방문하지 못하는 곳이 있을 수 있다는 것이다. 그래서 첫 번째 출력 시도처럼 그냥 visited를 출력하게 되면 0이어야 할 부분이 -1로 출력된다. 초기값을 0으로 바꾸자니 다른 visited 값에 -1씩 해줘야 해서 그냥 두 번째 출력 코드로 진행하는 것이 좋을 것 같다.

5 5
2 1 1 1 1
1 1 1 1 1
1 1 0 0 0
1 1 0 0 0
1 1 0 0 0




 


💙 You need to log in to GitHub to write comments. 💙
If you can't see comments, please refresh page(F5).