[BOJ / 백준] 2178번 미로 탐색 파이썬(Python) 문제 풀이

2021. 10. 6. 13:12·Baekjoon
728x90

문제

 

문제 링크 : https://www.acmicpc.net/problem/2178

 

2178번: 미로 탐색

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

www.acmicpc.net

 

 

 

 

CODE

from collections import deque
import sys

input = sys.stdin.readline

n, m = map(int, input().split())
miro = []
for i in range(n):
    miro.append(list(input().rstrip()))

visited = [[0] * m for _ in range(n)]
dir = [[1, 0], [-1, 0], [0, 1], [0, -1]]


def bfs(x, y):
    q = deque([[x, y]])
    visited[y][x] = 1

    while q:
        x, y = q.popleft()
        if x + 1 == m and y + 1 == n:
            print(visited[y][x])
            return

        for d in dir:
            nx, ny = x + d[0], y + d[1]
            if 0 <= nx < m and 0 <= ny < n:
                if visited[ny][nx] == 0 and miro[ny][nx] == '1':
                    q.append([nx, ny])
                    visited[ny][nx] = visited[y][x] + 1


bfs(0, 0)

 

 

 

 

 

풀이

💡 idea

- 가중치 없는 최단경로 문제 👉👉👉 BFS

- 방문 여부를 저장하는 visited에 True/False 값이 아닌 누적 이동 횟수를 저장

 

 

💡 implementation

- 배열 범위를 벗어나지 않았는지, 방문하지 않은 곳인지, 방문 가능한지('1')

            if 0 <= nx < m and 0 <= ny < n:
                if visited[ny][nx] == 0 and miro[ny][nx] == '1':

 

 

❌ 누적 이동 횟수를 visited에 넣지 않고 queue에 좌표값과 함께 저장했을 때

    * python3으로 돌리면 시간 초과, pypy3으로 돌리면 메모리 초과 발생

from collections import deque
import sys

input = sys.stdin.readline

n, m = map(int, input().split())
miro = []
for i in range(n):
    temp = list(input().rstrip())
    miro.append(temp)

visited = [[False] * m for _ in range(n)]
dir = [[1, 0], [-1, 0], [0, 1], [0, -1]]


def bfs(x, y):
    q = deque([[x, y, 1]])

    while q:
        x, y, cnt = q.popleft()
        visited[y][x] = True
        for d in dir:
            nx, ny = x + d[0], y + d[1]
            if 0 <= nx < m and 0 <= ny < n:
                if not visited[ny][nx] and miro[ny][nx] == '1':
                    if nx + 1 == m and y + 1 == n:
                        return cnt + 1
                    q.append([nx, ny, cnt + 1])

print(bfs(0, 0))

 

⭕ 누적 이동횟수를 visited에 1씩 증가시키며 저장

visited[ny][nx] = visited[y][x] + 1

 

 

 

 

 

결과

 

 

 

 

 

 

 

728x90
저작자표시 비영리 (새창열림)

'Baekjoon' 카테고리의 다른 글

[BOJ / 백준] 2606번 바이러스 파이썬(Python) 문제 풀이  (0) 2021.10.06
[BOJ / 백준] 1697번 숨바꼭질 파이썬(Python) 문제 풀이  (0) 2021.10.06
[BOJ / 백준] 1303번 전쟁 - 전투 파이썬 (Python) 문제 풀이  (0) 2021.10.06
[BOJ / 백준] 1260번 DFS와 BFS 파이썬(Python) 문제 풀이  (0) 2021.10.06
[BOJ / 백준] 15683번 감시 파이썬(Python) 문제 풀이  (0) 2021.08.04
'Baekjoon' 카테고리의 다른 글
  • [BOJ / 백준] 2606번 바이러스 파이썬(Python) 문제 풀이
  • [BOJ / 백준] 1697번 숨바꼭질 파이썬(Python) 문제 풀이
  • [BOJ / 백준] 1303번 전쟁 - 전투 파이썬 (Python) 문제 풀이
  • [BOJ / 백준] 1260번 DFS와 BFS 파이썬(Python) 문제 풀이
s_ih_yun
s_ih_yun
  • s_ih_yun
    CODESYUN
    s_ih_yun
  • 전체
    오늘
    어제
    • 분류 전체보기 (326)
      • Computer Science (26)
        • Concept (3)
        • Algorithm (23)
      • Web (54)
        • Web (7)
        • Spring (14)
        • MyBatis (1)
        • AWS (7)
        • HTML & CSS (14)
        • JavaScript (11)
      • Programming (37)
        • C++ (3)
        • Java (6)
        • Python (10)
        • MySQL (1)
        • Oracle (2)
        • Git (15)
        • Dev Tools (0)
      • Infra˙ DevOps (1)
      • Baekjoon (104)
        • 단계별로 풀어보기 (78)
      • CodeUp (98)
        • Python 기초 100제 (98)
      • Programmers (2)
      • Books (3)
      • etc (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • Syun's Pages
  • 인기 글

  • 태그

    CSS
    github
    JavaScript
    웹
    HTML
    알고리즘
    web
    myBatis
    Programmers
    codeup
    clean code
    MySQL
    db
    Python
    java
    VS Code
    Cloud
    C
    oracle
    자료구조
    aws
    CodeUp 기초 100제
    Tistory
    BOJ
    git
    spring
    c++
    단계별로 풀어보기
    SourceTree
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
s_ih_yun
[BOJ / 백준] 2178번 미로 탐색 파이썬(Python) 문제 풀이
상단으로

티스토리툴바