백준 14503번 - 로봇 청소기
로봇 청소기 문제 바로 가기
풀이 날짜: 2026-01-05
baekjoon 알고리즘 문제 풀이
풀이 코드
import sys
input = sys.stdin.readline
from collections import deque
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
count = 0
n,m = map(int, input().split())
r,c,d = map(int, input().split())
area = []
for _ in range(n):
area.append(list(map(int, input().split())))
def dfs(x,y,d):
global count
if area[x][y] == 0:
area[x][y] = 2
count += 1
for _ in range(4):
d = (d-1) % 4
nx = dx[d] + x
ny = dy[d] + y
if area[nx][ny] == 0:
dfs(nx, ny, d)
return
back_dir = (d+2)%4
bx = dx[back_dir] + x
by = dy[back_dir] + y
if area[bx][by] == 1:
return
dfs(bx,by,d)
dfs(r,c,d)
print(count)
문제 핵심 요약:
로봇은 (x, y) 위치에서 방향 d를 바라보며 다음 규칙을 반복한다.
1) 현재 칸이 아직 청소되지 않았으면 청소한다.
2) 왼쪽으로 회전한 뒤, 그 방향의 앞 칸이 청소되지 않은 빈칸(0)이면 그 칸으로 이동한다.
3) 2)의 과정을 4번(4방향) 반복해서도 이동할 칸이 없으면 뒤로 후진한다.
4) 뒤가 벽(1)이면 작동을 멈춘다.
즉, “갈 수 있는 칸을 찾는 과정”이 아니라,
정해진 회전 규칙과 후진 규칙을 그대로 시뮬레이션 해야 정답이 나오는 문제였다.
내가 선택한 풀이 방식: DFS
이 문제는 로봇의 상태가 항상 하나이고, 이동도 한 번에 한 칸씩 “한 경로”로 진행되기 때문에
DFS를 사용했다.
dfs(x, y, d)
→ “로봇이 (x,y)에서 d 방향을 보고 있을 때, 규칙대로 계속 진행했을 때의 청소 결과를 반영한다.”
중요한 점: DFS를 쓴다고 해서 “모든 경로를 탐색”하는 게 아니다.
DFS는 단지 시뮬레이션 흐름을 재귀로 표현한 도구일 뿐이다.
방향 설계가 제일 중요했다
방향 인덱스는 반드시 문제의 정의와 같아야 한다.
0: 북, 1: 동, 2: 남, 3: 서
따라서 dx, dy는 아래처럼 고정했다.
(0북 1동 2남 3서) dx = [-1, 0, 1, 0] dy = [0, 1, 0, -1]