[ BOJ / Python ] 1726번 로봇

황승환·2022년 5월 8일
0

Python

목록 보기
290/498


이번 문제는 BFS를 이용하여 해결하였다. 로봇의 위치와 방향에 대한 방문 처리를 위하여 방문 처리 리스트를 3차원 배열로 만들었고, 각 위치와 방향 별로 방문 처리를 하였다. 그리고 앞으로 가는 명령에서 다음 가려는 좌표가 1일 경우에는 그보다 더 앞으로 나아갈 수 없으므로 break해주었고, 방향의 회전은 따로 함수를 구현하여 쉽게 사용하였다.

Code

import collections
m, n=map(int, input().split())
grid=[list(map(int, input().split())) for _ in range(m)]
sy, sx, sd=map(int, input().split())
ey, ex, ed=map(int, input().split())
sy, sx, sd, ey, ex, ed=sy-1, sx-1, sd-1, ey-1, ex-1, ed-1
dy, dx=[0, 0, 1, -1], [1, -1, 0, 0]
def get_right_d(d):
    if d==0:
        return d+2
    if d==1:
        return d+2
    if d==2:
        return d-1
    if d==3:
        return d-3
def get_left_d(d):
    if d==0:
        return d+3
    if d==1:
        return d+1
    if d==2:
        return d-2
    if d==3:
        return d-2
def bfs(y, x, d):
    q=collections.deque()
    q.append((y, x, d, 0))
    visited=[[[False for _ in range(4)] for _ in range(n)] for _ in range(m)]
    visited[y][x][d]=True
    while q:
        y, x, d, cnt=q.popleft()
        if (y, x, d)==(ey, ex, ed):
            return cnt
        for i in range(1, 4):
            ny, nx, nd=y+i*dy[d], x+i*dx[d], d
            if 0<=ny<m and 0<=nx<n and not visited[ny][nx][nd]:
                if grid[ny][nx]==1:
                    break
                else:
                    visited[ny][nx][nd]=True
                    q.append((ny, nx, nd, cnt+1))
        ny1, nx1, nd1=y, x, get_right_d(d)
        if not visited[ny1][nx1][nd1]:
            visited[ny1][nx1][nd1]=True
            q.append((ny1, nx1, nd1, cnt+1))
        ny2, nx2, nd2=y, x, get_left_d(d)
        if not visited[ny2][nx2][nd2]:
            visited[ny2][nx2][nd2]=True
            q.append((ny2, nx2, nd2, cnt+1))
answer=bfs(sy, sx, sd)
print(answer)

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글