[Python] 14503번 로봇 청소기

이세령·2023년 6월 10일
0

알고리즘

목록 보기
29/43

문제

https://www.acmicpc.net/problem/14503

풀이과정

  • 현재 칸 청소되지 않은 경우, 현재 칸을 청소한다. → 방문여부 체크
  • 주변 4칸 중 청소되지 않은 빈 칸이 없는 경우 → 방향 필요 dx, dy

북 - 0, 동 - 1, 남 - 2, 서 - 3

  • 시계방향으로 이동방향을 결정하기 때문에 (d+3)%4
    • 현재 방향 d가 위쪽 방향을 나타내는 0이라고 가정합니다.

    • 시계 방향으로 움직이려면 로봇이 다음 방향인 오른쪽(방향 1)으로 회전해야 합니다.

    • 방향 번호는 시계 방향으로 0, 1, 2, 3 순으로 하다가 다시 0으로 돌아갑니다.

    • (d+3)은 현재 방향 d에 3을 더합니다.

    • % 4는 모듈로 4 연산을 수행하여 결과가 0에서 3 사이가 되도록 합니다.

      (d+3)%4를 사용하여 코드는 0 → 1 → 2 → 3 → 0 → 1 → 2 →…

  • 네 방향을 확인하기 위해 4번 반복
  • 각각 다음위치 계산 nx = r + dx[(d+3)%4]: 다음 행 위치를 계산합니다.
    ny = c + dy[(d+3)%4]: 다음 열 위치를 계산합니다.
  • 위치가 유효한지, 방문했는지 체크
  • 로봇이 네 방향 모두 청소했는지 체크
  • 벽인지, 비어있는 공간인지 체크
import sys
input = sys.stdin.readline

n, m = map(int, input().split())
graph = []
visited = [[0] * m for _ in range(n)]
r, c, d = map(int, input().split())

# 북 서 남 동 순서 0321
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

for _ in range(n):
    graph.append(list(map(int, input().split())))

# 처음 시작하는 곳 방문처리
visited[r][c] = 1
cnt = 1

while True:
    flag = 0
    # 4방향 확인
    for _ in range(4):
        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 graph[nx][ny] == 0:
            if visited[nx][ny] == 0:
                visited[nx][ny] = 1  # 방문처리
                cnt += 1
                r = nx
                c = ny
                flag = 1
                break
    if flag == 0:  # 4방향 모두 청소가 되어있다면
        if graph[r-dx[d]][c-dy[d]] == 1:  # 후진했을 때 벽이라면
            print(cnt)
            break
        else:
            r, c = r-dx[d], c-dy[d]  # 이전 위치로 돌아가기

방향을 지정할 때 수학에서의 x,y를 생각하는 것이 아니라, 2차배열에서 [x][y]가 어떻게 생기는지 생각하는 것이 편하다.
(1,1) (1,2) (1,3) (1,4)
(2,1) (2,2) (2,3) (2,4)
(3,1) (3,2) (3,3) (3,4)

profile
https://github.com/Hediar?tab=repositories

0개의 댓글