개인적으로 어려웠던 문제이다.
visited 배열을 크기 2짜리로 만들어서
wall을 부셨을때랑 안부셨을때의 경우를 나누어서 저장해주는 방식을 생각한다는게 어려웠다
그렇게 접근만 했으면 기본적인 bfs 문제라서 이후 금방 했을것같다.
시작점도 거리 1로 친다 하였으므로 마지막에 결과값에 +1을 해주었다.
from collections import deque
n , m = map(int,input().split())
back = [list(map(int,input().rstrip())) for _ in range(n)]
visited = [[[0]*2 for _ in range(m)] for _ in range(n)]
dy = [0,1,0,-1]
dx = [1,0,-1,0]
def bfs(a,b,wall):
queue = deque()
queue.append((a,b,wall))
while(queue):
y,x,wall = queue.popleft()
if (y,x) == (n-1,m-1):
return visited[y][x][wall]+1
for i in range(4):
ny = y + dy[i]
nx = x + dx[i]
if ny < 0 or ny >=n or nx <0 or nx >= m :
continue
if visited[ny][nx][wall] != 0:
continue
if back[ny][nx] == 0:
visited[ny][nx][wall] = visited[y][x][wall] + 1
queue.append((ny,nx,wall))
if back[ny][nx] == 1 and wall == 0:
visited[ny][nx][1] = visited[y][x][wall] + 1
queue.append((ny,nx,1))
return -1
print(bfs(0,0,0))
rstrip() : 오른쪽 공백을 제거한다
여러줄의 입력을 받을때 \n도 같이 들어오게 되는데 이때 사용하면 편리하다!!
lstrip() : 왼쪽 공백 제거
strip() : 양쪽 공백제거
그래서
여러줄 입력받을때
[list(map(int,input().rstrip())) for _ in range(n)] 요렇게 해주었다.
입력받는걸 \n 단위로 잘라서 int형으로 바꾸어 배열로 받았다.
보통은 띠어쓰기 단위로 주어지는경우가 많아서
input().split() 을 많이 썼는데
요렇게 붙여서 여러줄이 주어지면
input().rstrip() 을 쓰면 될것같다!
끝!!