알고리즘/백준

[백준 파이썬] 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)