https://www.acmicpc.net/problem/14503
북 - 0, 동 - 1, 남 - 2, 서 - 3
현재 방향 d
가 위쪽 방향을 나타내는 0이라고 가정합니다.
시계 방향으로 움직이려면 로봇이 다음 방향인 오른쪽(방향 1)으로 회전해야 합니다.
방향 번호는 시계 방향으로 0, 1, 2, 3 순으로 하다가 다시 0으로 돌아갑니다.
(d+3)
은 현재 방향 d
에 3을 더합니다.
% 4
는 모듈로 4 연산을 수행하여 결과가 0에서 3 사이가 되도록 합니다.
(d+3)%4
를 사용하여 코드는 0 → 1 → 2 → 3 → 0 → 1 → 2 →…
nx = r + dx[(d+3)%4]
: 다음 행 위치를 계산합니다.ny = c + dy[(d+3)%4]
: 다음 열 위치를 계산합니다.import sys
input = sys.stdin.readline
n, m = map(int, input().split())
graph = []
visited = [[0] * m for _ in range(n)]
r, c, d = map(int, input().split())
# 북 서 남 동 순서 0321
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
for _ in range(n):
graph.append(list(map(int, input().split())))
# 처음 시작하는 곳 방문처리
visited[r][c] = 1
cnt = 1
while True:
flag = 0
# 4방향 확인
for _ in range(4):
nx = r + dx[(d+3) % 4]
ny = c + dy[(d+3) % 4]
d = (d+3) % 4 # 한바퀴 확인했으면 해당 방향으로 작업 시작
# 영역 확인, 깨끗한지 확인
if 0 <= nx < n and 0 <= ny < m and graph[nx][ny] == 0:
if visited[nx][ny] == 0:
visited[nx][ny] = 1 # 방문처리
cnt += 1
r = nx
c = ny
flag = 1
break
if flag == 0: # 4방향 모두 청소가 되어있다면
if graph[r-dx[d]][c-dy[d]] == 1: # 후진했을 때 벽이라면
print(cnt)
break
else:
r, c = r-dx[d], c-dy[d] # 이전 위치로 돌아가기
방향을 지정할 때 수학에서의 x,y를 생각하는 것이 아니라, 2차배열에서 [x][y]가 어떻게 생기는지 생각하는 것이 편하다.
(1,1) (1,2) (1,3) (1,4)
(2,1) (2,2) (2,3) (2,4)
(3,1) (3,2) (3,3) (3,4)