해빈이는 로봇을 좋아한다. 로봇을 가지고 놀던 해빈이는 로봇에게 계속해서 명령을 내려 움직이는 대신 이동할 방향을 미리 지정하여 로봇이 알아서 움직이도록 하였다. 이 로봇은 다음과 같은 규칙을 가지고 움직인다.
로봇은 사용자가 지정한 방향을 일직선으로 움직인다. 이동 중 벽이나 방문한 지역, 장애물을 만날 경우 로봇은 사용자가 지정한 다음 방향으로 움직인다. 사용자가 지정한 다음 방향이 없다면 맨 처음 방향으로 돌아가서 위의 과정을 반복한다. 로봇이 움직일 수 없을 경우 동작을 멈춘다.
입력으로 방의 크기와 장애물의 개수, 각 장애물들의 위치, 로봇의 시작 위치, 이동 방향의 순서가 주어졌을 때 로봇이 멈추는 위치를 출력하시오. 위치 (0, 0)은 왼쪽 위를 가리키며 방의 크기가 R * C일 때 오른쪽 아래 위치는 (R - 1, C - 1)이 된다. (R은 세로의 크기를 C은 가로의 크기를 말한다.)
첫 번째 줄에는 방의 크기 R, C(3 ≤ R, C ≤ 1,000)가 입력된다. 두 번째 줄에는 장애물의 개수 k(0 ≤ k ≤ 1,000)가 입력된다. 다음 k개의 줄에는 각 장애물 위치 br(0 ≤ br ≤ R – 1), bc(0 ≤ bc ≤ C - 1)가 주어진다. 그 다음 순서대로 로봇의 시작 위치 sr(0 ≤ sr ≤ R – 1), sc(0 ≤ sc ≤ C - 1)와 이동 방향의 순서(총 4개가 입력되는데 1은 위 방향, 2은 아래 방향, 3은 왼쪽 방향, 4는 오른쪽 방향을 나타낸다)가 한 줄씩 입력된다. 로봇의 시작위치에 장애물이 있는 경우는 없다.
출력
로봇의 마지막 위치 r, c를 출력한다.
입력 예시
3 3
1
1 0
1 1
1 2 3 4
출력 예시
0 0
풀이
구현 문제. 로봇은 현재 진행방향을 기준으로 4번 동안 경로 업데이트의 기회를 얻으며, 4번 모두 실패할 경우 더 이상 움직일 수 없다는 의미이므로 탐색을 종료하고 좌표를 추력하면 된다. 이외에는 기본적인 경로 탐색 문제와 결부시켜 생각하면 쉽다. 이동 방향의 순서를 고려하지 않아서 생각보다 시간이 너무 오래 걸려버렸다...
풀이 코드
import sys
input = sys.stdin.readline
dr = [-1, 1, 0, 0]
dc = [0, 0, -1, 1]
R, C = map(int, input().split())
visited = [[False]*C for _ in range(R)]
k = int(input())
for _ in range(k) :
br, bc = map(int, input().split())
visited[br][bc] = True
sr, sc = map(int, input().split())
visited[sr][sc] = True
so = 0
order = list(map(lambda x : int(x)-1, input().split()))
flg = True
while flg :
flg = False
for i in range(4) :
ao = (so + i) % 4
ar, ac = sr + dr[order[ao]], sc + dc[order[ao]]
if -1 < ar < R and -1 < ac < C and not visited[ar][ac] :
sr, sc, so = ar, ac, ao
visited[sr][sc] = True
flg = True
break
print(sr, sc)