본문 바로가기
알고리즘/[python] 백준 BOJ

[python] 백준 1726 로봇

by Alan_Kim 2023. 11. 22.
728x90
반응형

https://www.acmicpc.net/problem/1726

 

1726번: 로봇

많은 공장에서 로봇이 이용되고 있다. 우리 월드 공장의 로봇은 바라보는 방향으로 궤도를 따라 움직이며, 움직이는 방향은 동, 서, 남, 북 가운데 하나이다. 로봇의 이동을 제어하는 명령어는

www.acmicpc.net

 

 

문제 해결

  • BFS를 이용해서 새로운 길을 가면서 최소 거리를 찾는 것은 쉽게 알 수 있다.
  • 그러나 방향을 좌, 우로 90도만큼 트는 것을 생각해야하고 직선으로 1칸부터 3칸까지 갈 수 있다는 것을 생각해야한다.
    • visited에 바라보는 방향까지 포함시켜서 3차원 리스트로 저장을 하도록 한다.
  • 회전은 90도만 가능하므로 동,서일 때는 남,북으로 회전 가능하고 남,북일 대는 동,서 방향으로 회전 가능하다.
  • 중간에 3칸을 가고 싶어도 벽(1)이 있으면 갈 수 없으므로 1칸부터 3칸까지 반복문을 이용해서 갈 수 있으면 que에 넣고 아니면 break를 이용해서 더 못간다는 알고리즘을 작성한다.
  • 조건을 분리해서 코드를 짜면 충분히 짤 수 있는 난이도

 

CODE

import sys
input = sys.stdin.readline
from collections import deque

def bfs():
    dx = (0,0,0,1,-1)
    dy = (0,1,-1,0,0)

    visited = [[[0]*5 for _ in range(n)] for _ in range(m)]
    visited[sx-1][sy-1][sdir] = 1
    que = deque()
    que.append((sx-1,sy-1,sdir,0))

    while que:
        x, y, dir, cnt = que.popleft()
        if (x,y,dir) == (ex-1, ey-1, edir):return cnt
        for dis in range(1,4):
            nx = x + dx[dir]*dis
            ny = y + dy[dir]*dis
            nd = dir
            if not (0<=nx<m and 0<=ny<n) or board[nx][ny]:break
            if visited[nx][ny][nd]:continue
            que.append((nx,ny,nd,cnt+1))
            visited[nx][ny][nd] = 1
        
        if dir==1 or dir==2:
            if not visited[x][y][3]:
                visited[x][y][3] = 1
                que.append((x,y,3,cnt+1))
            if not visited[x][y][4]:
                visited[x][y][4] = 1
                que.append((x,y,4,cnt+1))
        else:
            if not visited[x][y][1]:
                visited[x][y][1] = 1
                que.append((x,y,1,cnt+1))
            if not visited[x][y][2]:
                visited[x][y][2] = 1
                que.append((x,y,2,cnt+1))

if __name__=='__main__':
    m, n = map(int, input().split())
    board = [list(map(int, input().split())) for _ in range(m)]
    sx, sy, sdir = map(int, input().split())
    ex, ey, edir = map(int, input().split())
    result = bfs()
    print(result)
728x90
반응형

'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글

[python] 백준 7579 앱  (0) 2023.11.26
[python] 백준 11559 Puyo Puyo  (1) 2023.11.23
[python] 백준 18808 스티커 붙이기  (0) 2023.11.18
[python] 백준 14215 세 막대  (0) 2023.11.17
[python] 백준 9063 대지  (1) 2023.11.16

댓글