diff --git a/백준/Gold/2206. 벽 부수고 이동하기/README.md b/백준/Gold/2206. 벽 부수고 이동하기/README.md new file mode 100644 index 0000000..a8b71b9 --- /dev/null +++ b/백준/Gold/2206. 벽 부수고 이동하기/README.md @@ -0,0 +1,34 @@ +# [Gold III] 벽 부수고 이동하기 - 2206 + +[문제 링크](https://www.acmicpc.net/problem/2206) + +### 성능 요약 + +메모리: 205044 KB, 시간: 5932 ms + +### 분류 + +너비 우선 탐색, 그래프 이론, 그래프 탐색 + +### 제출 일자 + +2025년 3월 17일 19:34:49 + +### 문제 설명 + +

N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로로 이동하려 한다. 최단경로는 맵에서 가장 적은 개수의 칸을 지나는 경로를 말하는데, 이때 시작하는 칸과 끝나는 칸도 포함해서 센다.

+ +

만약에 이동하는 도중에 한 개의 벽을 부수고 이동하는 것이 좀 더 경로가 짧아진다면, 벽을 한 개 까지 부수고 이동하여도 된다.

+ +

한 칸에서 이동할 수 있는 칸은 상하좌우로 인접한 칸이다.

+ +

맵이 주어졌을 때, 최단 경로를 구해 내는 프로그램을 작성하시오.

+ +### 입력 + +

첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000)이 주어진다. 다음 N개의 줄에 M개의 숫자로 맵이 주어진다. (1, 1)과 (N, M)은 항상 0이라고 가정하자.

+ +### 출력 + +

첫째 줄에 최단 거리를 출력한다. 불가능할 때는 -1을 출력한다.

+ diff --git a/백준/Gold/2206. 벽 부수고 이동하기/벽 부수고 이동하기.py b/백준/Gold/2206. 벽 부수고 이동하기/벽 부수고 이동하기.py new file mode 100644 index 0000000..93bf4fa --- /dev/null +++ b/백준/Gold/2206. 벽 부수고 이동하기/벽 부수고 이동하기.py @@ -0,0 +1,41 @@ +import sys +from collections import deque +from collections import defaultdict + +sys.setrecursionlimit(10**6) + +input = sys.stdin.readline + +graph = defaultdict(list) + +n, m = map(int, input().split()) +arr = [] + +for i in range(n): + arr.append(list(map(int, input().strip()))) + +dist = [[[0 for _ in range(2)] for _ in range(m)] for _ in range(n)] + +dx = [0, 1, 0, -1] +dy = [1, 0, -1, 0] + +now_x, now_y = 0, 0 + +q = deque([(0, 0, False)]) +dist[0][0][0] = 1 + +while q: + x, y, jump = q.popleft() + if x == m-1 and y == n-1: + print(dist[y][x][jump]) + sys.exit(0) + for dx, dy in ((x+1, y), (x, y+1), (x-1, y), (x, y-1)): + if 0<=dx