[백준] #14503 로봇청소기 Python

0

Problem Solving

목록 보기
22/49
post-thumbnail
post-custom-banner

https://www.acmicpc.net/problem/14503

풀이

from collections import deque

n, m = map(int, input().split())
r, c, d = map(int, input().split())
graph = [list(map(int,input().split())) for _ in range(n)]

visited = [[0]*m for _ in range(n)]
visited[r][c] = 1

# 바라보는 방향 왼쪽으로 도는 함수 (현재 방향 기준)
def turnLeft(direction):
    return {0:3, 1:0, 2:1, 3:2}[direction]
# 바라보는 위치 기준 왼쪽 좌표
goLeft = {0: [0,-1], 1: [-1,0], 2:[0,1], 3:[1,0]}
# 바라보는 위치 기준 뒷쪽 좌표
goBack = {0: [1,0], 1: [0,-1], 2:[-1,0], 3:[0,1]}

q= deque()
q.append([r,c])
count = 0
ans = 1
while q:
    x, y = q.popleft()
    
    # 4번 연속 회전이라면 
    if count >= 4:
       # 뒷쪽 좌표 가져오기
       nx, ny = goBack[d][0]+x, goBack[d][1]+y
       # 뒤로 갈때는 청소여부 상관없음, 벽인지만 검사
       if 0<=nx<n and 0<=ny<m and not graph[nx][ny]:
           q.append([nx,ny]) # 위치 업데이트
           count = 0 # 카운트 초기화
           continue
       else:
      	# 카운트가 4번이고, 뒷쪽이 벽이라면 종료
           break 
           
    # 내 왼쪽 좌표 가져오기
    nx, ny = goLeft[d][0]+x, goLeft[d][1]+y
    
    # 바라보는 위치 업데이트
    d = turnLeft(d)
    
    # 범위내에 있고 왼쪽좌표(nx,ny)가 빈칸이면서 청소하지 않았다면
    if 0<=nx<n and 0<=ny<m and not graph[nx][ny] and not visited[nx][ny]:
        q.append([nx,ny]) #위치 이동
        visited[nx][ny] = 1 #청소하기
        ans += 1 #청소구역 + 1
        count = 0 # 카운트 초기화
    else:
        # 돌기만하므로 제자리로 위치 업데이트
        q.append([x,y])
        count += 1 #제자리 회전하므로 카운트+1

# 답 출력
print(ans)
post-custom-banner

0개의 댓글