구현, 시뮬레이션 문제이다. 문제에 적힌 그대로 구현하면 풀리지만, 코드로 옮기는 과정에서 한두개의 실수조차 범하지 않기는 어렵다. 복잡한 로직은 필요 없이 문제를 아주 세심히 읽고 오차 없이 완벽하게 구현해내면 된다. 물론 난 제대로 안읽어서 고생했다.
# 구현, 시뮬레이션
import sys
input= sys.stdin.readline
# 입력받기
N, M =map(int, input().split())
x, y, d =map(int, input().split())
room = [list(map(int, input().split())) for _ inrange(N)]
# 0, 1, 2, 3 -> 북 동 남 서
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
# 청소 시작
room[x][y] =2
result =1
defcleaner(x, y, d):
global result
# 무한루프 방지를 위한 for문
for _ inrange(50**3):
clean =False# 청소여부
# 4방향 탐색
for _ inrange(4):
d = (d +3) %4
nx = x + dx[d]
ny = y + dy[d]
# 미청소 구역일 경우 전진
if room[nx][ny] ==0:
clean =True
room[nx][ny] =2
result +=1
x, y = nx, ny
break
# 4방향 갈곳이 없으면 후진 ( 방향 유지 )
ifnot clean:
tmpDir = (d +2) %4
nx = x + dx[tmpDir]
ny = y + dy[tmpDir]
# 후진했는데 벽이라면 종료
if room[nx][ny] ==1:
return
x, y = nx, ny
# 결과 출력
cleaner(x, y, d)
print(result)
구현해 놓고 보면 간단하다. 그냥 문제 지문 자체가 정답이니까.
헷갈렸던 부분을 살펴보자면
1. 첫 번째 위치 청소 체크 안 한것
2. 후진 시 방향 변경하면 안되는데 한것
3. 반시계 방향이라고 해 놓고 문제 입력값 0, 1, 2, 3은 시계 방향으로 주어진 것
4. 반시계 방향전환 로직 그 자체
이 정도다. 특히 이 중에서 4번이 매우 헷갈렸다.
시뮬레이션 문제를 많이 안 풀어보기도 했고 어떻게 해야 반시계 방향으로 쉽게 전환을 할 수 있지.. 머리를 싸매고 특이하게 구현했었는데 자꾸 틀려서 방향 변경 로직만 다른 코드를 참고했다.
directions = [3, 2, 1, 0] # 서, 남, 동, 북
num = directions.index(d) # directions[num % 4] 하면 방향 나옴
dx = [0, 1, 0, -1] # 서, 남, 동, 북
dy = [-1, 0, 1, 0]
처음엔 이렇게 구현해서 directions[num % 4] + 2 % len(dx) 뭐 막 이런 식으로 복잡하게 했었는데 내가 봐도 헷갈리고 이상하게 테스트 케이스에서 오차가 조금씩 있었어서.. 분명히 방향 전환을 쉽게 딱 할 수 있는 코드가 있을 것 같은데 내 머리론 생각해내지 못했다. 그래서 다른 코드 방향 전환 부분만 약간 참고하게 됐다.
전체적인 로직은 다 맞는 거 같은데 계속 틀려서 뭐가 문제지 하다가 방향 전환 부분만 바꾸니 쉽게 통과되었다.
내 부족함 때문에 조금 헤매긴 했지만, 결국 문제 지문을 잘 숙지한다면 쉽게 풀렸을 문제인 것 같다.