BOJ 14503. 로봇청소기

Wooseok Jung·2023년 4월 12일
0

CodingTestStudy

목록 보기
2/5
post-thumbnail
post-custom-banner

반시계 방향으로 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)
profile
더 나은 세상을 만들고 싶은 인공지능 개발자
post-custom-banner

0개의 댓글