문제 출처
풀이
- 로봇이 바라보고 있는 위치에서 청소하기위해 이동할때 좌표의 변화량과 바라보는 방향을 표시하는 방향 딕셔너리를 만든다.
- 로봇이 네 방향 모두 청소하지 못할때 후진하기 위한 좌표의 변화량을 방향별로 표시하는 후진 딕셔너리를 만든다.
- 이동 횟수를 1로 초기화한다.
- 현재 로봇의 좌표에 해당하는 배열의 값을 바꿔 청소가 완료된 것을 표시한다.
- 방향 딕셔너리에서 해당 방향의 배열을 순회하며 청소 가능 유무를 확인한다.
- 청소가 가능하면 이동 횟수를 증가시키고 다음 위치로 이동하고 4번으로 돌아간다.
- 청소가 불가능 하면 후진 딕셔너리에서 다음 위치를 찾아 이동하고 4번으로 돌아간다.
- 청소가 불가능 하고 후진 했을때 배열 범위를 벗어나거나 벽이면 작업을 완료한다.
N, M = map(int, input().split())
r, c, d = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
bfs = {
0: [(-1, 0, 3), (0, 1, 2), (1, 0, 1), (0, -1, 0)],
1: [(0, -1, 0), (-1, 0, 3), (0, 1, 2), (1, 0, 1)],
2: [(1, 0, 1), (0, -1, 0), (-1, 0, 3), (0, 1, 2)],
3: [(0, 1, 2), (1, 0, 1), (0, -1, 0), (-1, 0, 3)]
}
back = {
0: (1, 0),
1: (0, -1),
2: (-1, 0),
3: (0, 1)
}
def check_clean(c, r):
global cnt
if r < 0 or r >= N or c < 0 or c >= M or arr[r][c]:
return False
cnt += 1
return True
cnt = 1
while 1:
arr[r][c] = 2
for dc, dr, nd in bfs[d]:
nr, nc = r+dr, c+dc
if check_clean(nc, nr):
r, c, d = nr, nc, nd
break
else:
nr, nc = r+back[d][0], c+back[d][1]
if nr >= 0 or nr < N or nc >= 0 or nc < M:
if arr[nr][nc] == 1:
break
r, c = nr, nc
else:
break
print(cnt)
'백준' 카테고리의 다른 글
[python] 15683. 감시 (0) | 2019.07.24 |
---|---|
[python] 14890. 경사로 (0) | 2019.07.15 |
[python] 14502. 연구소 (0) | 2019.07.13 |
[python] 14501. 퇴사 (1) | 2019.07.10 |
[python] 14499. 주사위 굴리기 (0) | 2019.07.08 |