https://www.acmicpc.net/problem/14503
BFS로 풀었다.
1번 2번 3번을 while True 안에서 차례대로 구현했다.
먼저 현재 칸이 청소되지 않았다면 청소했다. -1이 청소했다는 의미이다.
그리고 상하좌우로 청소가 안된 칸이 있는지 확인했다.
만약 청소가 안된 칸이 한 개라도 있다면 반시계 방향으로 틀고, 한 칸 전진해 줬다.
이때 d -= 1을 하면 인덱스를 벗어나기 때문에 반드시 나머지 연산을 해주어야 한다.
만약 청소가 안된 칸이 없다면 (모두 청소되어 있다면) 후진을 하기 위해 방향을 나머지 연산을 해주고, 벽이 아닌 경우 후진했다. 만약 벽인 경우 while문을 탈출하기 위해 break도 작성하였다.
( d - 1 ) % 4 가 반시계 방향 회전인 이유
방향 리스트를 북 > 동 > 남 > 서 순서로 작성했기 때문에 인덱스를 -1 해줘야 반시계 방향이 된다.
( d + 2 ) % 4 가 후진인 이유
북과 남, 동과 서의 차이를 두 칸으로 두었기 때문에 +2 또는 -2를 해줘야 후진이 된다.
정답 코드
import sys
from collections import deque
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]
while True:
if graph[r][c] == 0:
graph[r][c] = -1 # 청소
count = 0
for i in range(4):
nx = r + dx[i]
ny = c + dy[i]
if 0 <= nx < n and 0 <= ny < m:
if graph[nx][ny] == 0:
count += 1
if count != 0:
d = (d - 1) % 4
if 0 <= r + dx[d] < n and 0 <= c + dy[d] < m and graph[r + dx[d]][c + dy[d]] == 0:
r += dx[d]
c += dy[d]
else:
back_d = (d + 2) % 4
if 0 <= r + dx[back_d] < n and 0 <= c + dy[back_d] < m and graph[r + dx[back_d]][c + dy[back_d]] != 1:
r += dx[back_d]
c += dy[back_d]
else:
break
answer = 0
for i in range(n):
answer += graph[i].count(-1)
print(answer)
'PS > 백준' 카테고리의 다른 글
[백준] 16234번 인구 이동 (python) (0) | 2024.09.05 |
---|---|
[백준] 16236번 아기 상어 (python) (4) | 2024.07.15 |
[백준] 14502번 연구소 (python) (0) | 2024.07.13 |
[백준] 15686번 치킨 배달 (python) (0) | 2024.07.13 |
[백준] 14889번 스타트와 링크 (python) (0) | 2024.07.07 |