# 문제
백준 14503 로봇청소기 파이썬 풀이
# 코드
import sys
from collections import deque
def print2D(arr):
for i in arr :
print(i)
print()
N,M = map(int,sys.stdin.readline().split())
# 로봇 청소기 위치, 바라보는 방향
r,c,d = map(int,sys.stdin.readline().split())
board = list()
NORTH = 0
EAST = 1
SOUTH = 2
WEST = 3
# 반시계 방향으로 회전한다.
dirs = [
(-1,0),(0,1),(1,0),(0,-1)
]
for _ in range(N) :
line = list(map(int,sys.stdin.readline().split()))
board.append(line)
# 0 = 청소되지 않은 빈 칸
# 1 = 벽
cnt = 0
visit = [[False] * M for _ in range(N)]
dq = deque()
dq.append((r,c,d))
while len(dq) != 0 :
r,c,d = dq.pop()
# print("dq : ", dq)
# 방문처리를 진행한다.
if board[r][c] == 0 and visit[r][c] == False :
cnt +=1
visit[r][c] = True
# print(r,c,d)
# print2D(visit)
canGo = False
for i in range(1,5) :
nd = (d-i) % 4 # 다음방향을 결정한다.
dir = dirs[nd]
nr = r + dir[0]; nc = c + dir[1]
if 0 < nr < N and 0 < nc < M : # 이동이 가능하면
if visit[nr][nc] == False and board[nr][nc] == 0 : # 이동 가능한 조건이다.
dq.append( (nr,nc,nd) )
# print(nr, nc, nd)
canGo = True
break
if not canGo :
bd = (d+2) % 4 #후진방향
dir = dirs[bd]
br = r + dir[0]; bc = c + dir[1]
if (0 < br < N and 0 < bc < M ) and board[br][bc] == 0:
dq.append((br,bc,d)) # 후진이동
# print("back")
else :
break
print(cnt)
# 풀이
- 해당 문제는 조건에 대해서만 구현해야 한다. 조건에서 하라는대로! 특히 현재방향에서 앞에꺼를 보는것이 아닌 일단 90도 반시계로 회전부터 시켜야 한다.
- 이 문제에서는 회전에 대한 개념이 두번 등장한다.
- 반시계방향으로의 회전
for i in range(1,5) :
nd = (d-i) % 4 # 다음방향을 결정한다.
dir = dirs[nd]
nr = r + dir[0]; nc = c + dir[1]
- 뒷방향으로의 180도 회전
if not canGo :
bd = (d+2) % 4 #후진방향
dir = dirs[bd]
br = r + dir[0]; bc = c + dir[1]
- 모듈러 연산을 이용한다면 적절히 회전 시킬 수 있다.
'•알고리즘(Algorithm ) > 문제풀이' 카테고리의 다른 글
[백준15683&파이썬] 여러경우의 4방향 탐색 및 회전 가지치기와 완전탐색 (0) | 2023.06.23 |
---|---|
[백준14891&파이썬] 톱니바퀴를 돌릴때는 deque를 사용하자 (0) | 2023.06.17 |
[백준14499&파이썬] 주사위를 굴릴때의 조건에 대해 생각해보자 (0) | 2023.06.15 |
[백준3190&파이썬] 스네이크게임은 deque로 구현이 가능하다. (0) | 2023.06.13 |
[백준1865&파이썬] 플로이드 와샬을 통해 음의 사이클 판단하기 (0) | 2023.06.10 |