본문 바로가기
백준

[python] 14503. 로봇 청소기

by DylanMsK 2019. 7. 15.

문제 출처

14503. 로봇 청소기

 

풀이

  1. 로봇이 바라보고 있는 위치에서 청소하기위해 이동할때 좌표의 변화량과 바라보는 방향을 표시하는 방향 딕셔너리를 만든다.
  2. 로봇이 네 방향 모두 청소하지 못할때 후진하기 위한 좌표의 변화량을 방향별로 표시하는 후진 딕셔너리를 만든다.
  3. 이동 횟수를 1로 초기화한다.
  4. 현재 로봇의 좌표에 해당하는 배열의 값을 바꿔 청소가 완료된 것을 표시한다.
  5. 방향 딕셔너리에서 해당 방향의 배열을 순회하며 청소 가능 유무를 확인한다.
    1. 청소가 가능하면 이동 횟수를 증가시키고 다음 위치로 이동하고 4번으로 돌아간다.
    2. 청소가 불가능 하면 후진 딕셔너리에서 다음 위치를 찾아 이동하고 4번으로 돌아간다.
    3. 청소가 불가능 하고 후진 했을때 배열 범위를 벗어나거나 벽이면 작업을 완료한다.

 


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