본문 바로가기
Problem Solving

[Python][백준 14503] 로봇 청소기

by tls1107 2025. 1. 20.
728x90
반응형

[백준 14503] 로봇 청소기 Python 풀이

📌 문제 분석

  • 로봇 청소기가 주어진 방에서 청소할 수 있는 칸의 개수를 구하는 문제입니다.
  • 방은 2차원 배열로 표현되며, 각 칸은 벽(1) 또는 빈 칸(0)으로 이루어져 있습니다.
  • 로봇은 현재 위치에서 청소를 하고, 주변에 청소되지 않은 빈 칸이 있으면 반시계 방향으로 회전하여 이동합니다. 모든 방향이 벽인 경우 후진합니다.

🚨 시행착오

  • 처음에는 로봇의 이동과 청소 로직을 단순하게 구현했으나, 인덱스 범위 체크와 방향 전환 로직에서 문제가 발생했습니다.
  • 로봇이 청소한 칸을 제대로 표시하지 않거나, 후진 로직이 불완전하여 무한 루프에 빠지는 경우가 있었습니다.

처음 코드의 문제점

  • 인덱스 범위 체크가 부족하여 배열의 경계를 넘어가는 경우가 발생했습니다.
  • 방향 전환 로직이 불완전하여 모든 방향을 시도하지 못하는 경우가 있었습니다.

어떻게 고쳤나요?

  • 인덱스 범위 체크를 제거하고, 방의 가장자리가 벽으로 되어 있다는 점을 활용했습니다.
  • 방향 전환 로직을 개선하여 모든 방향을 시도하도록 수정했습니다.

💡 해결 방안

import sys

sys.stdin = open("input.txt", "r")

def check(x, y, arr):
    for k in range(4):
        nx = x + dx[k]
        ny = y + dy[k]
        if arr[nx][ny] == 0:  # 벽이 아닌 경우
            return True
    return False

def robot(x, y, d, arr):
    global result

    if arr[x][y] == 0:
        result += 1
        arr[x][y] = -1  # 청소한 칸 표시

    if check(x, y, arr):
        for k in range(4):
            t = (d - k) % 4  # 반시계 방향으로 줄어들게 수정
            nx = x + dx[t]
            ny = y + dy[t]
            if arr[nx][ny] == 0:  # 벽이 아닌 경우
                robot(nx, ny, t, arr)  # 방향을 t로 변경하여 재귀 호출
                return
    else:
        # 모든 방향이 벽인 경우 후진
        nx = x - dx[d]
        ny = y - dy[d]
        if arr[nx][ny] != 1:  # 벽이 아닌 경우
            robot(nx, ny, d, arr)  # 후진

N, M = map(int, input().split())
R, C, D = map(int, input().split())
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
arr = [list(map(int, input().split())) for _ in range(N)]
result = 0

robot(R, C, D, arr)

# 배열 출력
for row in arr:
    print(" ".join(f"{cell:2d}" for cell in row))  # 각 요소를 2자리로 맞춰서 출력

print(result)  # 결과를 출력

🎯 이 문제의 핵심 포인트

  1. 인덱스 범위 체크의 중요성: 배열의 경계를 넘어가는 것은 문제에서 이미 벽으로 막혀 있다고 했기 때문에 고려하지 않아도 됩니다.
  2. 방향 전환 로직: 로봇이 모든 방향을 시도하도록 방향 전환 로직을 개선해야 합니다.
  3. 청소한 칸 표시: 로봇이 청소한 칸을 올바르게 표시하여 중복 청소를 방지해야 합니다.
  4. 가독성 있는 출력: 결과를 보기 쉽게 출력하는 방법을 고려해야 합니다.

📝 예제로 이해하기

예제 입력:
3 3
1 1 0
1 1 1
1 0 1
1 1 1

예제 출력:
1
  • 입력된 방의 상태를 기반으로 로봇이 청소한 칸의 개수를 출력합니다.

✨ 이번 문제를 통해 배운 점

  1. 로봇의 동작 원리 이해: 로봇 청소기의 동작 원리를 이해하고 구현하는 과정에서 많은 것을 배웠습니다.
  2. 재귀 호출의 활용: 재귀 호출을 통해 문제를 해결하는 방법을 익혔습니다.
  3. 문제 해결을 위한 로직 개선: 초기 로직에서 발생한 문제를 개선하는 과정에서 문제 해결 능력을 키웠습니다.

🔍 코드 설명

  • check 함수: 주어진 위치에서 청소되지 않은 빈 칸이 있는지 확인합니다.
  • robot 함수: 로봇의 동작을 구현하며, 청소한 칸을 표시하고 다음 이동을 결정합니다.
  • 메인 부분: 입력을 받고, 로봇의 초기 위치와 방향을 설정한 후, 로봇의 동작을 시작합니다.

이 문제를 통해 로봇 청소기의 동작을 구현하고, 알고리즘 문제 해결 능력을 향상시킬 수 있었습니다.

728x90
반응형

댓글