반시계 방향으로 90도씩 회전하는 로봇청소기가 청소한 횟수를 구하라
손풀려고 시작한 문제였음에도 불구하고, 디버깅에 시간이 오래 걸렸다. 이상했던 점은 청소기가 회전부터 수행하는데, 원래 자리로 돌아오고 나서 전진을 못한다는 점이었다.
북동남서 순서로 0,1,2,3 으로 설정하고, 주변에서 청소가능한 타일을 못찾았을 경우 False를 반환하게 설정하였는 데, 자세히 보니, False == 0 이어서
def check_room(n, m, grid, x, y, d):
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
for i in range(4):
d = rotate(d)
nx = x + dx[d]
ny = y + dy[d]
# 청소할 곳이 있다면 전진
if grid[nx][ny] == 0:
return d
# 한바퀴 회전 이후에도 청소되지 않는 빈칸이 없다면 후진 준비
return -1
주변에 청소할 타일이 있나 확인하는 지점에서 북쪽 방향을 반환하면 False를 반환하게 되는데, 이 부분에서 전진하지 못하고 False로 인식되어 반대로 후진하는 문제가 있었다.
최근 스터디원이 이동불가 한 개체를 -1로 표기하던데, 나도 False보다는 -1로 표기하는 습관을 들여야 할거같다.
# 회전 (시계 반대방향 90도)
def rotate(d):
return (d + 3) % 4
# 시계반대방향으로 회전하며 청소 가능한 (0) 인 칸 식별
def check_room(n, m, grid, x, y, d):
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
for i in range(4):
d = rotate(d)
nx = x + dx[d]
ny = y + dy[d]
# 청소할 곳이 있다면 전진
if grid[nx][ny] == 0:
return d
# 한바퀴 회전 이후에도 청소되지 않는 빈칸이 없다면 후진 준비
return -1
if __name__ == "__main__":
N, M = map(int, input().split())
r, c, d = map(int, input().split())
grid = [list(map(int, input().split())) for _ in range(N)]
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
# 청소 횟수
cnt = 0
# 후진해야하는데 뒤에 벽(1)이 있으면 break
while True:
# 현재 칸을 청소해야할때.
if grid[r][c] == 0:
cnt += 1
grid[r][c] = 2
# 청소할 다음 칸 찾기
next_d = check_room(N, M, grid, r, c, d)
# 청소할 곳이 없는 경우
if next_d == -1:
# 반대방향
op_d = (d + 2) % 4
# 후진 (방향은 유지됨)
nr = r + dx[op_d]
nc = c + dy[op_d]
# 뒤가 벽이면 정지
if grid[nr][nc] == 1:
break
# 뒤로 한칸 이동
else:
r = nr
c = nc
else:
r = r + dx[next_d]
c = c + dy[next_d]
d = next_d
print(cnt)