Algorithm/Implementation
(Python/파이썬) - 백준(BOJ) 14503번 : 로봇 청소기
하눤석
2022. 7. 19. 12:56
728x90
https://www.acmicpc.net/problem/14503
- 문제 :
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오.
로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북중 하나이다. 지도의 각 칸은 (r, c)로 나타낼 수 있고, r은 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로 부터 떨어진 칸의 개수이다.
로봇 청소기는 다음과 같이 작동한다.
- 현재 위치를 청소한다.
- 현재 위치에서 현재 방향을 기준으로 왼쪽방향부터 차례대로 탐색을 진행한다.
- 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다.
- 왼쪽 방향에 청소할 공간이 없다면, 그 방향으로 회전하고 2번으로 돌아간다.
- 네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다.
- 네 방향 모두 청소가 이미 되어있거나 벽이면서, 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춘다.
로봇 청소기는 이미 청소되어있는 칸을 또 청소하지 않으며, 벽을 통과할 수 없다.
- 풀이 :
시뮬레이션 문제였습니다.
문제에서 주어진 단계를 소스코드로 구현하면 됩니다.
1. 로봇이 종료하는 조건만 알고 시점은 모르기 때문에 while True문을 사용하였습니다.
2. 로봇의 탐색 순서는 현재 0,1,2,3의 순서로 북, 동, 남, 서 입니다. 따라서 dx, dy 배열을 순서에 맞게 선언합니다.
3. 로봇은 항상 바라보고 있는 방향의 왼쪽부터 탐색하므로 현재 바라보고 있는 방향에서 1을 뺀 값이 다음 탐색할 방향입니다.
4. 만약 4 방향을 모두 탐색하였지만 청소할 구역이 없다면 (if not flag:) 후진을 할 수 있는지 확인합니다.
5. 후진하려는 곳이 주어진 구역을 벗어나거나 벽일 경우 while문을 종료하고 이 때 청소한 구역 카운트를 출력합니다.
- 소스코드 :
import sys
input = sys.stdin.readline
d = [[-1,0], [0, 1], [1, 0], [0, -1]]
if __name__ == "__main__":
N,M = map(int,input().split())
R,C,D = map(int,input().split())
board = [list(map(int,input().split())) for _ in range(N)]
answer = 0
while True:
flag = False
if board[R][C] == 0:
board[R][C] = 2
answer += 1
for i in range(4):
ad = (D -i -1) % 4
ax = R + d[ad][0]
ay = C + d[ad][1]
if 0 <= ax < N and 0 <= ay < M and board[ax][ay] == 0:
flag = True
R,C,D = ax,ay,ad
break
# 네 방향에 청소할 공간이 없는 경우
if not flag:
# 한 칸 후진
R -= d[D][0]
C -= d[D][1]
# 보드 바깥으로 벗어난 경우
if (0 > R or R >= N or 0 > C or C >= M):
break
# 뒤쪽이 벽인 경우
if board[R][C] == 1:
break
print(answer)
320x100