티스토리 뷰

SMALL

문제 설명

https://www.acmicpc.net/problem/2178

N×M크기의 배열로 표현되는 미로가 있다.

1 0 1 1 1 1
1 0 1 0 1 0
1 0 1 0 1 1
1 1 1 0 1 1

미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다.

위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.

입력

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

출력

첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.

예제 입력 1

4 6
101111
101010
101011
111011

예제 출력 1

15

예제 입력 2

4 6
110110
110110
111111
111101

예제 출력 2

9

예제 입력 3

2 25
1011101110111011101110111
1110111011101110111011101

예제 출력 3

38

예제 입력 4

7 7
1011111
1110001
1000001
1000001
1000001
1000001
1111111

예제 출력 4

13

문제 요약) (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수 구하기

풀이 과정

  • 인접한 칸으로만 이동 가능 → dx, dy 사용
  • 최소의 칸 수 구하기 ⇒ 최단거리 구하기 → BFS

2차원 배열에서 dx, dy 사용해서 인접한 노드로 이동하는 너비 우선 탐색을 구현하면 됩니다.

거리를 구해야 하기 때문에 노드를 이동할 때마다 (이전 노드에 적힌 값 + 1)의 값으로 현재 노드에 적힌 값을 업데이트 해줍니다. 최종적으로 미로의 (N-1, M-1) 칸에 적힌 값을 출력하면 해당 값이 미로의 최단거리 값과 같습니다.

정답 코드

from collections import deque

N, M = map(int, input().split())
miro = [[] for _ in range(N)]
visited = [[False for _ in range(M)] for _ in range(N)]

for i in range(N):
    miro[i] = list(map(int, list(input())))

# 상하좌우 인접한 노드로 이동하기 위한 dx, dy 정의
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]

# 큐를 사용한 BFS 구현
def BFS(x, y):
    queue = deque([(x, y)])
    visited[x][y] = True
    # 큐가 빌 때까지 반복
    while queue:
        now_x, now_y = queue.popleft()
        # 인접한 노드 = 상하좌우의 노드 -> 4번 확인 필요
        for d in range(4):
            nx = now_x + dx[d]
            ny = now_y + dy[d]
            # 범위 내에 있는 좌표이고
            # 아직 방문 안 한 좌표이고
            # 미로에 적힌 값이 1이면 -> 이동 가능한 위치이면
            if 0 <= nx < N and 0 <= ny < M and not visited[nx][ny] and miro[nx][ny] == 1:
                # 큐에 삽입
                queue.append((nx, ny))
                # 방문 처리
                visited[nx][ny] = True
                # 미로에 적힌 값을 이전 노드 + 1로 업데이트
                miro[nx][ny] = miro[now_x][now_y] + 1
# (0,0)에서 탐색 시작
BFS(0, 0)
# 마지막 칸에 적힌 값 = 미로 최단 거리
print(miro[N-1][M-1])

이상입니다.

LIST
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함