본문 바로가기

[BOJ] - Python

[백준] 14503 : 로봇 청소기 python

 

바라보는 방향을 유지한 채로 후진하는 것을 제대로 확인하지 못해서 계속 오답이 나왔다.

그렇게 어려운 문제는 아닌 것 같은데 왜 막상 풀면 잘 안 풀리는 건지..아직 연습이 많이 부족한 듯

 

from collections import deque
import sys
input = sys.stdin.readline

dx = [-1,0,1,0]
dy = [0,1,0,-1]

n, m = map(int,input().split())
r,c,d = map(int,input().split())
graph = []
visited = [[False for j in range(m)]for i in range(n)]
for i in range(n):
    graph.append(list(map(int,input().split())))

def bfs(a,b,d):
    queue = deque()
    queue.append((a,b))
    # 시작지점을 청소했다고 체크
    visited[a][b] = True
    cnt = 1
    
    while queue:
        x,y = queue.popleft()
        # 인접한 칸 중에 청소할 수 있는 게 있는지 체크하는 플래그
        flag = 0

        for _ in range(4):
        	# 반시계방향으로 회전
            d = (3+d)%4
            nx = x+dx[d]
            ny = y+dy[d]
			
            # 인접한 칸이 그래프 범위 안에 있고
            # 청소할 수 있는 칸이며 아직 방문하지 않았다면
            if 0<=nx<n and 0<=ny<m and graph[nx][ny]==0:
                if not visited[nx][ny]:
                	# 청소했다고 체크
                    cnt +=1
                    flag = 1
                    # 해당 칸을 큐에 넣음
                    queue.append((nx,ny))
                    visited[nx][ny] = True
                    # 청소를 마쳤으니 break
                    break
                    
		# 인접한 칸 중에 청소할 게 없다면
        if flag ==0:
        	# 바라보는 방향 그대로 후진할 수 없다면
            if graph[x-dx[d]][y-dy[d]]==1:
            	# 청소한 칸 수를 리턴
                return cnt
                
            # 후진할 수 있다면
            else:
            	# 이동할 좌표를 후진한 칸으로 변경
                # 그 칸에서 다시 bfs 수행
                nx = x-dx[d]
                ny = y-dy[d]
                queue.append((nx,ny))
                visited[nx][ny] = True
    return cnt

print(bfs(r,c,d))