2178번: 미로 탐색

2024. 1. 27. 19:21· 알고리즘/백준
728x90
 

2178번: 미로 탐색

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

www.acmicpc.net

 

BFS로 최단 거리를 탐색하는 문제.

처음에는 단순히 visited배열에 해당 칸 방문 여부만 저장했는데,

거기에 더해 방문하기까지 방문한 칸수를 저장하면 도착지까지의 최단 시간을 구할 수 있다.


풀이 코드

# 2178번: 미로 탐색
from collections import deque

n, m = map(int, input().split())
graph = []
visited = [[0] * m for _ in range(n)] # 현재 칸까지 방문한 칸 수를 저장(0일 경우 방문하지 않은 것)
for i in range(n):
    row = list(map(int, input()))
    graph.append(row)

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

def bfs(graph, x, y, visited):
    queue = deque([(x, y)]) # 시작위치를 큐에 넣고 시작
    visited[x][y] = 1

    while queue:
        x, y = queue.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

            # 칸을 벗어날 경우 다음으로 넘어감
            if nx < 0 or nx >= n or ny < 0 or ny >= m:
                continue

            # 이동할 수 없는 칸인 경우 다음으로 넘어감
            if graph[nx][ny] == 0:
                continue
            
            # 이동할 수 있는 칸이고, 방문하지 않은 경우
            if graph[nx][ny] == 1 and visited[nx][ny] == 0:
                queue.append((nx, ny))
                visited[nx][ny]  = visited[x][y] + 1
                if (nx, ny) == (n - 1, m - 1):
                    return visited[n-1][m-1]
                

print(bfs(graph, 0, 0, visited))

 


 

...
visited = [[0] * m for _ in range(n)] # 현재 칸까지 방문한 칸 수를 저장(0일 경우 방문하지 않은 것)
...


def bfs(graph, x, y, visited):
  ...
            
            # 이동할 수 있는 칸이고, 방문하지 않은 경우
            if graph[nx][ny] == 1 and visited[nx][ny] == 0:
                queue.append((nx, ny))
                visited[nx][ny]  = visited[x][y] + 1
                if (nx, ny) == (n - 1, m - 1):
                    return visited[n-1][m-1]

 

이 테크닉을 잘 기억해둬야겠다.

728x90

'알고리즘 > 백준' 카테고리의 다른 글

15686번: 치킨 배달  (1) 2024.01.30
1697번: 숨바꼭질  (0) 2024.01.29
3190번: 뱀  (0) 2024.01.27
1012번: 유기농 배추  (1) 2024.01.26
11053번: 가장 긴 증가하는 부분 수열  (0) 2023.03.28
'알고리즘/백준' 카테고리의 다른 글
  • 15686번: 치킨 배달
  • 1697번: 숨바꼭질
  • 3190번: 뱀
  • 1012번: 유기농 배추
happenundo
happenundo
happenundo
2023~ 개발블로그
happenundo
전체
오늘
어제
  • 분류 전체보기 (207)
    • TIL (3)
    • 알고리즘 (188)
      • 프로그래머스 (47)
      • 백준 (69)
      • 파이썬 문법 (11)
      • 이것이 코딩테스트다 (46)
      • 알고리즘 노트 (6)
      • SQL (8)
    • Spring (4)
      • Spring 입문 (2)
      • 개인 프로젝트 (1)
      • 인텔리제이 (1)
    • CS (8)
      • DB (2)
      • 네트워크 (1)
      • 그외 (5)
    • ~2022 (1)
    • etc (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 재귀
  • 우선순위큐
  • 이진탐색
  • BinarySearch
  • 파이썬
  • BFS
  • distinct
  • 백준
  • 정렬
  • dfs
  • 스택
  • 동적프로그래밍
  • 프로그래머스
  • 이것이코딩테스트다
  • CS
  • 이코테
  • deepcopy
  • 알고리즘
  • DP
  • 큐
  • 최단거리
  • 백트래킹
  • 괄호변환
  • 구현
  • 완전탐색
  • sql
  • 플로이드워셜
  • 다익스트라
  • 그리디
  • 다이나믹프로그래밍

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
happenundo
2178번: 미로 탐색
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.