깡뇽

[백준] 14503번 로봇 청소기 파이썬 본문

Algorithm/BAEKJOON

[백준] 14503번 로봇 청소기 파이썬

깡뇽 2022. 10. 4. 02:34
반응형

로봇 청소기 장소 : N x M 크기의 직사각형 (1x1 크기의 정사각형 칸으로 나누어짐)

지도 (r, c) (r : 북쪽으로부터 떨어진 칸의 개수, c : 서쪽으로부터 떨어진 칸의 개수)

<로봇 청소기 작동>

1. 현재 위치 청소

2. 현재 위치에서 현재 방향을 기준으로 왼쪽방향부터 차례로 탐색 진행

   (1) 왼쪽 방향에 아직 청소 안 한 공간이 있으면, 그 방향으로 회전 후 다음 한 칸 전진하고 1번부터 진행

   (2) 왼쪽 방향에 청소 필요 없으면, 그 방향으로 회전하고 2번으로 돌아가기

   (3) 네 방향 모두 청소가 이미 끝났거나 벽이면, 바라보는 방향을 유지한 채로 한 칸 후진하고 2번으로 돌아가기

   (4) 네 방향 모두 청소가 이미 되어있거나 벽이면서, 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동 멈추기

 

14503번 로봇 청소기

#입력
n, m = map(int, input().split())
r, c, d = map(int, input().split())
#지도
numbers = []
for _ in range(n):
  numbers.append(list(map(int, input().split())))
#방문 확인 할 리스트
visited = [[0] * m for _ in range(n)]
#이동방향 
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

visited[r][c] = 1
cnt = 1

while(1):
  flag = 0
  for _ in range(4):
    #0북, 1동, 2남, 3서 전부 왼쪽부터 탐색
    nx = r + dx[(d+3)%4]
    ny = c + dy[(d+3)%4]

    d = (d+3)%4 #이동 업데이트
    
    #벽 내부 확인
    if 0 <= nx < n and 0 <= ny < m and numbers[nx][ny] == 0:
      if visited[nx][ny] == 0: #방문 안 한 곳
        visited[nx][ny] = 1 
        cnt += 1
        #위치 업데이트
        r = nx 
        c = ny
        flag = 1 #청소 완료
        break
        
  if flag == 0: #동서남북 모두 청소가 완료된 상태
    if numbers[r-dx[d]][c-dy[d]] == 1: #후진해서 벽인지 확인
      print(cnt) #종료
      break
    else: #벽이 아니므로 위치 업데이트
      r = r-dx[d]
      c = c-dy[d]

 

- 도움을 받은 글 : https://resilient-923.tistory.com/164

반응형