boj 2206 벽부수고 이동하기 (골드4)

김준오·2021년 7월 18일
0

알고리즘

목록 보기
20/91
post-thumbnail

boj 2206 벽부수고 이동하기

개인적으로 어려웠던 문제이다.

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()

rstrip() : 오른쪽 공백을 제거한다
여러줄의 입력을 받을때 \n도 같이 들어오게 되는데 이때 사용하면 편리하다!!

lstrip() : 왼쪽 공백 제거
strip() : 양쪽 공백제거

그래서
여러줄 입력받을때
[list(map(int,input().rstrip())) for _ in range(n)] 요렇게 해주었다.
입력받는걸 \n 단위로 잘라서 int형으로 바꾸어 배열로 받았다.

보통은 띠어쓰기 단위로 주어지는경우가 많아서
input().split() 을 많이 썼는데
요렇게 붙여서 여러줄이 주어지면
input().rstrip() 을 쓰면 될것같다!

끝!!

profile
jooooon

0개의 댓글

관련 채용 정보