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) # 결과를 출력
🎯 이 문제의 핵심 포인트
- 인덱스 범위 체크의 중요성: 배열의 경계를 넘어가는 것은 문제에서 이미 벽으로 막혀 있다고 했기 때문에 고려하지 않아도 됩니다.
- 방향 전환 로직: 로봇이 모든 방향을 시도하도록 방향 전환 로직을 개선해야 합니다.
- 청소한 칸 표시: 로봇이 청소한 칸을 올바르게 표시하여 중복 청소를 방지해야 합니다.
- 가독성 있는 출력: 결과를 보기 쉽게 출력하는 방법을 고려해야 합니다.
📝 예제로 이해하기
예제 입력:
3 3
1 1 0
1 1 1
1 0 1
1 1 1
예제 출력:
1
- 입력된 방의 상태를 기반으로 로봇이 청소한 칸의 개수를 출력합니다.
✨ 이번 문제를 통해 배운 점
- 로봇의 동작 원리 이해: 로봇 청소기의 동작 원리를 이해하고 구현하는 과정에서 많은 것을 배웠습니다.
- 재귀 호출의 활용: 재귀 호출을 통해 문제를 해결하는 방법을 익혔습니다.
- 문제 해결을 위한 로직 개선: 초기 로직에서 발생한 문제를 개선하는 과정에서 문제 해결 능력을 키웠습니다.
🔍 코드 설명
- check 함수: 주어진 위치에서 청소되지 않은 빈 칸이 있는지 확인합니다.
- robot 함수: 로봇의 동작을 구현하며, 청소한 칸을 표시하고 다음 이동을 결정합니다.
- 메인 부분: 입력을 받고, 로봇의 초기 위치와 방향을 설정한 후, 로봇의 동작을 시작합니다.
이 문제를 통해 로봇 청소기의 동작을 구현하고, 알고리즘 문제 해결 능력을 향상시킬 수 있었습니다.
728x90
반응형
'Problem Solving' 카테고리의 다른 글
[백준 2240] 자두나무 Python 풀이 (0) | 2025.02.26 |
---|---|
[Python][백준 14719] 빗물 (0) | 2025.02.06 |
[Python][백준 1759] 암호 만들기 (0) | 2025.01.14 |
[Python][BOJ 1239] 중심선 개수 세기 (0) | 2025.01.09 |
[Python][BOJ 22352] 항체 인식 (0) | 2025.01.08 |
댓글