SAMSUNG/삼성 SW 역량 테스트 준비

[백준 14503번] 로봇 청소기 (Python)

sanadoing_ 2023. 10. 13. 20:56
728x90

> 파이썬, 구현, 시뮬레이션

 

 

 

 

 

📖 문제 : 로봇 청소기 (Python)

 

 

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

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

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

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

 

입력

첫째 줄에 방의 크기 이 입력된다. (3≤N,M≤50)둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 (와 처음에 로봇 청소기가 바라보는 방향 가 입력된다. 인 경우 북쪽, 경우 동쪽, 인 경우 남쪽, 인 경우 서쪽을 바라보고 있는 것이다.

셋째 줄부터 개의 줄에 각 장소의 상태를 나타내는 NxM개의 값이 한 줄에 개씩 입력된다. 번째 줄의 번째 값은 칸 의 상태를 나타내며, 이 값이 인 경우 가 청소되지 않은 빈 칸이고, 인 경우 에 벽이 있는 것이다. 방의 가장 북쪽, 가장 남쪽, 가장 서쪽, 가장 동쪽 줄 중 하나 이상에 위치한 모든 칸에는 벽이 있다. 로봇 청소기가 있는 칸은 항상 빈 칸이다.

 

출력

로봇 청소기가 작동을 시작한 후 작동을 멈출 때까지 청소하는 칸의 개수를 출력한다.

 

예제 입력 1 

3 3
1 1 0
1 1 1
1 0 1
1 1 1

예제 출력 1 

1

 

예제 입력 2 

11 10
7 4 0
1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 1
1 0 0 0 1 1 1 1 0 1
1 0 0 1 1 0 0 0 0 1
1 0 1 1 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 1 0 1
1 0 0 0 0 0 1 1 0 1
1 0 0 0 0 0 1 1 0 1
1 0 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1

 

예제 출력 2 

57
 
 

 

 

내 코드

dy = [-1, 0, 1, 0]  # 북, 동, 남, 서
dx = [0, 1, 0, -1]

N, M = map(int, input().split())
y, x, d = map(int, input().split())
room = [list(map(int, input().split())) for _ in range(N)]
result = 0

while True:

    # 현재 칸이 청소가 되지 않은 경우 -> 청소 !
    if room[y][x] == 0:
        result += 1
        room[y][x] = 3  # 3은 청소를 완료한 칸

    else:
        dd = d
        # 현재 칸의 주변 4칸 탐색
        for _ in range(4):

            dd = (dd - 1) % 4  # 북,동,남,서를 +1이 아닌, -1로 -> 북,서,남,동 으로 반시계 90도로
            yy = y + dy[dd]
            xx = x + dx[dd]

            # 주변 4칸 중 청소 안한 칸이 있을 경우
            if 0 <= yy < N and 0 <= xx < M and room[yy][xx] == 0:
                room[yy][xx] = 3
                y = yy
                x = xx
                d = dd
                result += 1
                break
        # 현재 칸의 주변 4칸에 청소되지 않은 빈 칸이 없는 경우
        else:
            # 바라보는 방향을 유지한 채, 한 칸 '후진' 이므로
            # 나아가는 방향은 바라보는 방향의 반대가 된다. 북 <-> 남, 동 <-> 서 그렇기 때문에 -2
            dd = (d - 2) % 4
            yy = y + dy[dd]
            xx = x + dx[dd]

            if 0 <= yy < N and 0 <= xx < M:
                # 벽이라서 후진이 불가능한 경우 -> 작동 정지
                if room[yy][xx] == 1:
                    break
                else:
                    y = yy
                    x = xx

print(result)

 

 

Point ! ⭐️ 

  • 는 주석 잘 보면 될 듯 !!

 

dd = (dd - 1) % 4 
는 필수네유 ,,

 

 

 

 

 

백준

https://www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$  둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽

www.acmicpc.net

 

728x90