로봇 청소기와 방의 상태가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오.
로봇 청소기가 있는 방은
크기의 직사각형으로 나타낼 수 있으며,
크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북 중 하나이다. 방의 각 칸은 좌표
로 나타낼 수 있고, 가장 북쪽 줄의 가장 서쪽 칸의 좌표가
, 가장 남쪽 줄의 가장 동쪽 칸의 좌표가
이다. 즉, 좌표
는 북쪽에서
번째에 있는 줄의 서쪽에서
번째 칸을 가리킨다. 처음에 빈 칸은 전부 청소되지 않은 상태이다.
로봇 청소기는 다음과 같이 작동한다.
from sys import stdin; input=stdin.readline
N, M = map(int,input().split()) # 가로, 세로 받아오기
sx, sy, d = map(int,input().split()) # x좌표, y좌표, 방향
field = [list(map(int,input().split())) for _ in range(N)]
# 문제에서 제시한 방향대로 북 - 동 - 남 - 서
dx = [-1,0,1,0]
dy = [0,1,0,-1]
# 청소한 칸을 세는 변수
cnt = 0
while True:
# 현재 칸이 청소되지 않았으면 청소하고, 값을 -1로 변경
if field[sx][sy] == 0:
field[sx][sy] = -1
cnt += 1
# 2번 상황일 경우
if field[sx-1][sy] != 0 and field[sx+1][sy] != 0 and field[sx][sy+1] != 0 and field[sx][sy-1] != 0:
# 2-2. 후진할 수 없는 경우 break
if field[sx + dx[(d+2)%4]][sy + dy[(d+2)%4]] == 1:
break
# 후진할 수 있는 경우 한 칸 후진
else:
sx = sx + dx[(d+2)%4]
sy = sy + dy[(d+2)%4]
continue
# 3번 상황일 경우
else:
# 반시계방향이므로 +3
d = (d+3)%4
if field[sx+dx[d]][sy+dy[d]] == 0:
sx = sx+dx[d]
sy = sy+dy[d]
continue
print(cnt)