본문 바로가기
Python/백준

백준 로봇 청소기 [14503] 파이썬(Python) 코드 + 해설

by Guardy 2024. 10. 25.
728x90

14503 로봇 청소기 문제 Python

문제 이해하기

이 문제는 로봇 청소기가 방을 돌아다니며 청소하는 영역의 개수를 구하는 것이다.

문제 설명

  • 방의 구조: N x M 크기의 직사각형 방이 있고, 각 칸은 벽(1) 또는 빈 칸(0)이다.
  • 로봇 청소기의 위치와 방향:
    • 좌표 (r, c)에 위치해 있으며, 방향 d를 가지고 있다.
    • 방향 d는 북(0), 동(1), 남(2), 서(3) 중 하나이다.
  • 로봇 청소기의 작동 방식:
    1. 현재 위치를 청소한다.
    2. 현재 위치에서 다음을 반복한다:
      • 주변 4칸 중 청소되지 않은 빈 칸이 있는지 확인한다.
        • 있다면, 반시계 방향으로 90도 회전하고, 전진한다.
        • 없다면, 바라보는 방향을 유지한 채로 후진한다.
          • 후진할 수 없다면 작동을 멈춘다.
    3. 청소한 칸의 개수를 구한다.

해결 방법: 시뮬레이션 구현

이 문제는 로봇 청소기의 동작을 그대로 구현하는 시뮬레이션 문제이다.

구현 단계

  1. 입력 받기:
    • 방의 크기 N, M과 로봇 청소기의 초기 위치 (r, c), 방향 d를 입력받는다.
    • 방의 상태를 2차원 리스트로 저장한다.
  2. 방문 여부 표시:
    • 청소한 칸을 표시하기 위해 방문 배열을 사용한다.
    • 청소한 칸은 visited[r][c] = True로 표시한다.
  3. 로봇 청소기의 동작 구현:
    • 현재 위치를 청소한다.
    • 다음을 반복한다:
      • 현재 위치에서 현재 방향을 기준으로 왼쪽 방향부터 차례대로 탐색한다.
      • 왼쪽 방향에 청소되지 않은 빈 칸이 있으면 그 방향으로 회전하고 한 칸 전진한다.
      • 네 방향 모두 청소되어 있거나 벽인 경우, 바라보는 방향을 유지한 채로 한 칸 후진한다.
        • 후진할 수 없다면 작동을 멈춘다.
  4. 결과 출력:
    • 청소한 칸의 개수를 출력한다.

방향 설정

  • 방향은 북(0), 동(1), 남(2), 서(3)이다.
  • 각 방향에서 왼쪽 방향은 (direction + 3) % 4로 계산할 수 있다.
  • 이동할 때는 dx, dy 리스트를 사용하여 방향에 따른 좌표 변화를 적용한다.

정답 파이썬 코드

N, M = map(int, input().split())
r, c, d = map(int, input().split())
room = [list(map(int, input().split())) for _ in range(N)]
visited = [[0]*M for _ in range(N)]

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

visited[r][c] = 1  # 현재 위치 청소
count = 1  # 청소한 칸의 수

while True:
    clean = False
    for _ in range(4):
        # 왼쪽 방향으로 회전
        d = (d + 3) % 4
        nx = r + dx[d]
        ny = c + dy[d]
        # 청소되지 않은 빈 칸인 경우 전진
        if 0 <= nx < N and 0 <= ny < M:
            if room[nx][ny] == 0 and visited[nx][ny] == 0:
                visited[nx][ny] = 1
                count += 1
                r, c = nx, ny
                clean = True
                break
    # 네 방향 모두 청소가 이미 되어있거나 벽인 경우
    if not clean:
        # 후진할 위치 계산
        nx = r - dx[d]
        ny = c - dy[d]
        # 후진할 수 있으면 후진
        if 0 <= nx < N and 0 <= ny < M and room[nx][ny] == 0:
            r, c = nx, ny
        else:
            break  # 후진할 수 없으면 작동 멈춤

print(count)

핵심 포인트

  • 시뮬레이션의 정확한 구현: 문제에서 제시한 로봇 청소기의 동작을 그대로 코드로 구현하는 것이 중요하다.
  • 방향 처리:
    • 방향을 숫자로 관리하여 회전과 이동을 편리하게 구현한다.
    • 왼쪽 회전은 (d + 3) % 4로 계산한다.
  • 청소 여부와 벽 판단:
    • 방문 배열 visited를 사용하여 청소 여부를 관리한다.
    • 방의 상태 room을 사용하여 벽인지 아닌지 판단한다.
  • 반복 구조의 이해:
    • 청소기가 작동을 멈출 때까지 반복하면서 내부에서 방향 전환과 이동을 처리한다.

백준 14503 로봇 청소기 정답

도움이 되셨다면 공감과 댓글 부탁드립니다.

728x90