🧑🏻💻 문제링크
이런 문제가 나오면 처음에는 너무 막막하다. 마치 수학 문제처럼 지문은 길지만 구하는 과정들을 보면 별로 어렵지 않은...
이 문제에서 가장 유의할 것은 d가 주어졌을 때 어느 방향으로 바라볼 것 인지 확인해 주어야 한다는 것이다. 나는 change()
라는 함수를 만들어서 풀어보았다.
def change(d):
# d가 0인 경우 -> 북
if d == 0:
return 3
# d가 1인 경우 -> 동
if d == 1:
return 0
# d가 2인 경우 -> 남
if d == 2:
return 1
# d가 3인 경우 -> 서
if d == 3:
return 2
def solution(r, c, d):
cnt = 1
x = r
y = c
matrix[x][y] = 2
while(1):
empty = 0
dc = d
for i in range(4):
dc = change(dc)
nx = x + dx[dc]
ny = y + dy[dc]
# 범위를 벗어나지 않고 청소가 필요한 부분을 탐색
if 0 < nx <= N and 0 < ny <= M and matrix[nx][ny] == 0:
cnt += 1
x = nx
y = ny
matrix[x][y] = 2
d = dc
empty = 1
break
# 4방향 모두 탐색 후 모든 칸이 청소되어 있을 때
if empty == 0:
if d == 0:
x += 1
elif d == 1:
y -= 1
elif d == 2:
x -= 1
elif d == 3:
y += 1
# 후진하는 칸이 벽이면 stop
if matrix[x][y] == 1:
break
return cnt
# N: 세로 크기, M: 가로 크기
N, M = map(int, input().split())
# (r, c): 북쪽에서 떨어진 칸의 개수, 서쪽으로 부터 떨어진 칸의 개수
r, c, d = map(int, input().split())
matrix = [list(map(int, input().split())) for _ in range(N)]
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
print(solution(r, c, d))