크기의 직사각형 공간에서 로봇 청소기가 작동합니다. 로봇 청소기는 특정 규칙(현재 위치 청소 왼쪽 방향 탐색 전진 또는 후진)에 따라 움직이며, 청소기가 작동을 멈출 때까지 청소하는 칸의 개수를 구하는 문제입니다.
이 문제는 복잡한 알고리즘(탐색, DP 등)을 떠올리기보다는, 문제에서 제시한 작동 규칙을 토씨 하나 틀리지 않고 그대로 코드로 번역하는 시뮬레이션(구현) 능력이 핵심입니다.
가장 중요한 포인트는 방향 전환과 후진을 어떻게 코드로 매끄럽게 짜느냐입니다.
dx = [-1, 0, 1, 0], dy = [0, 1, 0, -1]로 매핑해 줍니다.d에서 왼쪽으로 돌면 북(0) 서(3), 서(3) 남(2)이 되어야 합니다. 이를 if문으로 덕지덕지 나누지 않고, d = (d + 3) % 4 라는 모듈러 연산 한 줄로 우아하게 처리합니다.visited 배열을 따로 쓰지 않고, 청소한 칸을 graph에 2 로 마킹했습니다. 이렇게 하면 빈 칸(0), 벽(1), 청소한 칸(2)이 완벽히 구분됩니다. 후진을 할 때는 방향을 바꿀 필요 없이 현재 좌표에서 해당 방향 벡터를 빼주면 됩니다 (r - dx[d]). 이때 조건은 칸이 1(벽)만 아니면 되므로, 2(청소한 칸)를 만나도 안전하게 후진할 수 있습니다.import sys
input = sys.stdin.readline
N, M = map(int, input().split())
r, c, d = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(N)]
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
move = 0
while True:
if graph[r][c] == 0:
graph[r][c] = 2
move += 1
blank = 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 and graph[nx][ny] == 0:
r = nx
c = ny
blank = True
break
if not blank:
back_x = r - dx[d]
back_y = c - dy[d]
if 0 <= back_x < N and 0 <= back_y < M and graph[back_x][back_y] != 1:
r, c = back_x, back_y
else:
break
print(move)
(d+3)%4): 시뮬레이션 문제에서 방향을 다룰 때 가장 실수가 많이 나오는 곳이 회전 로직입니다. 처음엔 d -= 1 후 음수가 되면 3으로 바꿔주는 식의 처리를 고민할 수 있지만, (d+3)%4 공식을 활용함으로써 코드를 훨씬 단축시키고 휴먼 에러를 방지할 수 있는 모듈러 연산의 강력함을 뼈저리게 느꼈습니다.visited 배열의 생략과 상태 분리: 공간을 탐색할 때 무조건 True/False 기반의 visited 배열을 만들려는 강박이 있었습니다. 하지만 이 문제처럼 "벽인지", "청소한 곳인지", "청소 안 한 곳인지" 3가지 상태가 필요할 때는 맵의 데이터를 직접 가공(0, 1, 2)하여 활용하는 것이 메모리와 논리 흐름 모두에 훨씬 직관적이라는 깨달음을 얻었습니다.