14503 로봇 청소기

정민용·2023년 5월 12일

백준

목록 보기
199/286

문제

로봇 청소기와 방의 상태가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오.

로봇 청소기가 있는 방은 N×MN \times M 크기의 직사각형으로 나타낼 수 있으며, 1×11 \times 1 크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다.
청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북 중 하나이다. 방의 각 칸은 좌표
(r,c)(r, c)로 나타낼 수 있고, 가장 북쪽 줄의 가장 서쪽 칸의 좌표가 (0,0)(0, 0), 가장 남쪽 줄의 가장 동쪽 칸의 좌표가 (N1,M1)(N-1, M-1)이다. 즉, 좌표 (r,c)(r, c)는 북쪽에서 (r+1)(r+1)번째에 있는 줄의 서쪽에서 (c+1)(c+1)번째 칸을 가리킨다. 처음에 빈 칸은 전부 청소되지 않은 상태이다.

로봇 청소기는 다음과 같이 작동한다.

  1. 현재 칸이 아직 청소되지 않은 경우, 현재 칸을 청소한다.
  2. 현재 칸의 주변 44칸 중 청소되지 않은 빈 칸이 없는 경우,
    1. 바라보는 방향을 유지한 채로 한 칸 후진할 수 있다면 한 칸 후진하고 1번으로 돌아간다.
    2. 바라보는 방향의 뒤쪽 칸이 벽이라 후진할 수 없다면 작동을 멈춘다.
  3. 현재 칸의 주변 44칸 중 청소되지 않은 빈 칸이 있는 경우,
    1. 반시계 방향으로 9090^\circ 회전한다.
    2. 바라보는 방향을 기준으로 앞쪽 칸이 청소되지 않은 빈 칸인 경우 한 칸 전진한다.
    3. 1번으로 돌아간다.
# 14503
import sys
input = lambda: sys.stdin.readline().strip()

# 1. 현재 칸이 청소 X -> 청소 (arr[r][c] == 2 : 청소 완료)
# 2. 주변 4칸 중 빈칸 체크
# 3. 빈칸 O -> 반시계 90 회전 후 빈칸이라면 전진
# 4. 빈칸 X -> 후진 or 정지

n, m = map(int, input().split())
r, c, d = map(int, input().split())
dr, dc = [-1, 0, 1, 0], [0, 1, 0, -1]

arr = [list(map(int, input().split())) for _ in range(n)]

num = 0
check = True
while check:
    if arr[r][c] == 0:
        arr[r][c] = 2
        num += 1
    else:
        clean = False
        for i in range(4):
            nr, nc = r + dr[i], c + dc[i]
            if nr < 0 or nc < 0 or nr >= n or nc >= m or arr[nr][nc] == 1:
                continue
            if arr[nr][nc] == 0:
                clean = True
                break
                
        if clean:
            d -= 1
            if d < 0:
                d += 4
                
            nr, nc = r + dr[d], c + dc[d]
            if 0 <= nr < n and 0 <= nc < m and arr[nr][nc] == 0:
                r, c = nr, nc
        
        else:
            nr, nc = r - dr[d], c - dc[d]
            if 0 <= nr < n and 0 <= nc < m and arr[nr][nc] != 1:
                r, c = nr, nc
            else:
                check = False
                
print(num)

백준 14503 로봇 청소기

0개의 댓글