따로 문제를 푸는 방식은 없고, 주어진대로 문제를 해결하기만 하면 되기 때문에 구현 능력이 중요하다. 특히, 시뮬레이션 문제는 주어진 조건을 제대로 짚고 넘어가야 한다. 코드가 길어질 수 있기 때문에 변수의 이름을 처음부터 제대로 작성하는 습관을 길러야 겠다.
맵이 커지면 input으로 처리하는 속도가 늦어질 수 있어 sys.stdin.readline을 사용했다.
# 11:53
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
r, c, d = map(int, input().split())
graph = []
visited = [[False] * m for _ in range(n)]
answer = 0
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
# 맵 다운로드
for _ in range(n):
graph.append(list(map(int, input().split())))
# 현재 방향에서 왼쪽
def turn(d):
if d - 1 < 0:
return 3
return d - 1
while True:
flag = False
# 뒤로 점프하는 경우도 있기 때문에 if문 작성
if not visited[r][c]:
answer += 1
visited[r][c] = True
for i in range(4):
d = turn(d)
nowx = r + dx[d]
nowy = c + dy[d]
# 방문하지 않았고 청소도 가능함
if not visited[nowx][nowy] and graph[nowx][nowy] == 0:
flag = True
r = nowx
c = nowy
break
# 네 방향 모두 청소가 되있거나 벽
if not flag:
# 바라본 방향 바로 뒤에 벽
if graph[r - dx[d]][c - dy[d]] == 1:
break
# 뒤에 벽이 없음
else:
r -= dx[d]
c -= dy[d]
print(answer)