알고리즘/백준
[백준 파이썬] 14503 로봇 청소기
rocku
2023. 7. 21. 14:56
14503번: 로봇 청소기
첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$ 둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽
www.acmicpc.net
청소해야 할 칸이 있으면 우선 반시계 방향으로 90도 회전한다. 이 부분만 주의하면 된다.
N, M = map(int, input().split())
r, c, d = map(int, input().split())
room = [list(map(int, input().split())) for _ in range(N)]
direction = [[0, -1], [1, 0], [0, 1], [-1, 0]] # x, y / 문제에서 주어진 대로 북, 동, 남, 서쪽이다.
count = 0
while True:
# 1. 현재 위치가 청소되어있지 않다면 해준다.
if room[r][c] == 0:
count += 1
room[r][c] = 9
# 3. 반시계 방향으로 회전하기 위해 현재 방향 인덱스보다 하나 적은 값부터 줄여나간다.
for i in range(3, -1, -1):
nr = r + direction[(d+i)%4][1] # 예를들어 현재 방향이 남쪽(2)이라면
nc = c + direction[(d+i)%4][0] # 1, 0, 3, 2 순으로 확인한다.
# 방 범위를 넘어가는 경우는 체크하지 않는다.
if ((nr < 0 or nr > N-1) or (nc < 0 or nc > M-1)):
continue
# 청소를 해야한다면 방향을 청소해야하는 방향으로 틀어주고 그 방향으로 한 칸 이동한다.
elif room[nr][nc] == 0:
d = (d+i)%4
r = nr
c = nc
break
else:
# 2. 청소할 칸이 없거나 벽이라면 현재 방향의 반대 방향으로 한 칸 이동한다.
# 바라보는 방향은 유지한다.
r = r + direction[(d+2)%4][1]
c = c + direction[(d+2)%4][0]
# 뒤로 이동한 위치가 방 범위를 넘어가거나 벽이라면 종료한다.
if ((r < 0 or r > N-1) or (c < 0 or c > M-1)
or room[r][c] == 1):
break
print(count)