포스트

[백준] 14503 로봇 청소기

문제 설명

문제 링크

방이 1과 0으로 주어지며, 이 중 1은 벽, 0은 청소되지 않은 공간이다. 로봇 청소기는 벽을 넘지 못하며, 빈 공간을 통해서만 이동이 가능하다.
시작 위치와 초기 바라보고 있는 방향이 주어지며, 로봇 청소기는 바라보고 있는 방향 기준으로 앞/뒤로만 이동이 가능하기에 다른 방향으로 이동하고자 한다면 회전을 해야 한다.

문제에서 주어진 로봇 청소기의 작동 방법은 다음과 같다:

  1. 현재 칸이 아직 청소되지 않은 경우, 현재 칸을 청소한다.
  2. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 없는 경우,
    1. 바라보는 방향을 유지한 채로 한 칸 후진할 수 있다면 한 칸 후진하고 1번으로 돌아간다.
    2. 바라보는 방향의 뒤쪽 칸이 벽이라 후진할 수 없다면 작동을 멈춘다.
  3. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 있는 경우,
    1. 반시계 방향으로 90도 회전한다.
    2. 바라보는 방향을 기준으로 앞쪽 칸이 청소되지 않은 빈 칸인 경우 한 칸 전진한다.
    3. 1번으로 돌아간다.

문제 풀이

평소에 파이썬의 클래스를 사용하지 않기 떄문에, 이번에 사용해보고자 했다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
class Vacuum:
    def __init__(self, r, c, d):
        self.r = r  # 청소기의 시작 행 위치
        self.c = c  # 청소기의 시작 열 위치
        self.d = d  # 청소기의 시작 방향

        # 방향 설정: 북, 동, 남, 서 순서
        self.directions = [(-1, 0), (0, 1), (1, 0), (0, -1)]

    def turn_left(self):
        # 현재 방향에서 왼쪽으로 90도 회전
        self.d = (self.d - 1) % 4

    def move_forward(self):
        # 현재 방향으로 한 칸 이동
        self.r += self.directions[self.d][0]
        self.c += self.directions[self.d][1]

# 방향 전환과 움직임을 테스트하기 위한 함수
def clean(room_map, r, c, d):
    N = len(room_map)
    M = len(room_map[0])

    vacuum = Vacuum(r, c, d)

    cleaned_count = 0

    while True:
        # 현재 위치 청소
        if room_map[vacuum.r][vacuum.c] == 0:
            room_map[vacuum.r][vacuum.c] = 2
            cleaned_count += 1

        # 네 방향 탐색하며 청소할 위치 찾기
        cleaned = False
        for _ in range(4):
            vacuum.turn_left()
            nr = vacuum.r + vacuum.directions[vacuum.d][0]
            nc = vacuum.c + vacuum.directions[vacuum.d][1]

            if room_map[nr][nc] == 0:
                vacuum.move_forward()
                cleaned = True
                break

        # 네 방향 모두 청소할 공간이 없는 경우 후진 또는 종료
        if not cleaned:
            back_d = (vacuum.d + 2) % 4
            nr = vacuum.r + vacuum.directions[back_d][0]
            nc = vacuum.c + vacuum.directions[back_d][1]

            if room_map[nr][nc] != 1:
                vacuum.r, vacuum.c = nr, nc
            else:
                break

    return cleaned_count

# 입력 받기
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
r, c, d = map(int, input().split())
room_map = [list(map(int, input().split())) for _ in range(N)]

# 청소 시작
result = clean(room_map, r, c, d)
print(result)

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.