새소식

⌨️ Algorithms/백준

[Python] 백준 2178번_미로 탐색

2023. 3. 30. 21:58

  • -

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

 

2178번: 미로 탐색

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

www.acmicpc.net

 

  • N×M크기의 배열로 표현되는 미로가 있음
  • 미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타냄
  • 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하기
  • 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있음
  • 칸을 셀 때에는 시작 위치와 도착 위치도 포함

  • 위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있음

 

  • 입력
    • 첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어짐
    • 다음 N개의 줄에는 M개의 정수로 미로가 주어짐
    • 각각의 수들은 붙어서 입력으로 주어짐
  • 출력
    • 첫째 줄에 지나야 하는 최소의 칸 수를 출력
    • 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어짐
  • 시간 제한: 1초
  • 메모리 제한: 192 MB

 

"""
입출력 예시)

(예제 입력 1) 
4 6
101111
101010
101011
111011
        -> 15

(예제 입력 2)
4 6
110110
110110
111111
111101
        -> 9

(예제 입력 3)
2 25
1011101110111011101110111
1110111011101110111011101
                            -> 38

(예제 입력 4)
7 7
1011111
1110001
1000001
1000001
1000001
1000001
1111111
        -> 13
"""

 

 

## 의사코드 ##

# 최소 칸 수 -> BFS
#from collections import deque

# N×M크기의 배열인 미로
# graph = [list(map(int, sys.stdin.readline().strip())) for _ in range(n)]
# 방문 처리 배열
# visited = [[0] * m for _ in range(n)]
# 상하좌우
# dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]

# 시작 노드를 큐에 삽입하고 방문처리 
# queue = deque([(0, 0)])
# visited[0][0] = 1 

# 큐에 삽입된 순서대로 x, y 꺼내서 방문하지 않은 노드를 방문 처리 후 큐에 삽입
# while queue: 
#     x, y = queue.popleft()
#     for i in range(4):
#         nx = x + dx[i]
#         ny = y + dy[i]
#         if 0 <= nx < n and 0 <= ny < m:
#             if visited[nx][ny] == 0 and graph[nx][ny] == 1:
#                 visited[nx][ny] = visited[x][y] + 1
#                 queue.append((nx, ny))

 

 

 

 

import sys
from collections import deque
n, m = map(int, input().split())
# N×M크기의 배열인 미로
graph = [list(map(int, sys.stdin.readline().strip())) for _ in range(n)]
# 방문 처리 배열
visited = [[0] * m for _ in range(n)]
# 상하좌우
dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]

# 시작 노드 추가
queue = deque([(0, 0)])
# 현재 노드 방문 처리
visited[0][0] = 1 

# 큐가 완전히 빌 때까지 반복
while queue:
    # 큐에 삽입된 순서대로 꺼내기
    x, y = queue.popleft()
    # (N, M)에 도착하면 최소 칸의 수 출력
    if x == n-1 and y == m-1:
        print(visited[x][y])
        break 
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if 0 <= nx < n and 0 <= ny < m:
            # 아직 방문되지 않았고 이동할 수 있는 칸이면 방문 처리 
            if visited[nx][ny] == 0 and graph[nx][ny] == 1:
                visited[nx][ny] = visited[x][y] + 1
                queue.append((nx, ny))

 

  • BFS(너비 우선 탐색)
    • 그래프에서 시작 노드에 인접한 노드부터 탐색하는 알고리즘
    • 주로 간선의 비용이 모두 동일한 조건에서 최단 거리를 구할 때 사용
    • 2개의 큐를 활용 -> deque로 구현

 

  • BFS(너비 우선 탐색) 실행 과정 
    • 1) 탐색 시작 노드를 큐에 삽입하고 방문 처리
    • 2) 큐에서 순서대로 노드를 꺼내 방문하지 않은 노드는 방문 처리 후 큐에 삽입
    • 3) 2번 과정을 더 이상 수행할 수 없을 때까지 반복

 

 

 

 

 

 

https://heytech.tistory.com/56

 

[Python] BFS 알고리즘 개념 및 실습

본 포스팅에서는 너비 우선 탐색이라고 불리는 BFS(Breadth-First Search)에 대해 알아봅니다. 📚 목차 1. BFS 알고리즘이란? 2. BFS 알고리즘 동작 과정 3. BFS 파이썬 구현 3.1. 소스코드 설명 3.2. 전체 소스

heytech.tistory.com

 

https://chancoding.tistory.com/64

 

[파이썬] 백준 2178번 미로 탐색 - BFS 최단 경로 탐색

미로 탐색 시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율 1 초 192 MB 63743 23204 14792 35.340% 문제 N×M크기의 배열로 표현되는 미로가 있다. 1 0 1 1 1 1 1 0 1 0 1 1 1 0 1 0 1 1 1 1 1 0 1 1 미로에서 1은

chancoding.tistory.com

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다!