소스 코드

# 방향 이동, 북 동 남 서
x = [-1,0,1,0]
y = [0,1,0,-1]
# n,m
N,M = map(int,input().split())
# 로봇 청소기 위치(r,c),방향
r,c,dir = map(int,input().split())
# 청소 구역
board = [list(map(int,input().split())) for _ in range(N)]
# 청소 확인
cleaned = [[0]*M for _ in range(N)]
# 청소한 영역의 개수
res = 1
# 시작점이 청소
cleaned[r][c] = 1
# 임시 저장
temp = []
# 시작 위치 추가
temp.append([r,c])
while len(temp) != 0:
i,j = temp.pop(0)
for q in range(4):
# 현재 바라보는 방향 기준에서 왼쪽 확인하기
N_i = i + x[(dir + 3 - q) % 4]
N_j = j + y[(dir + 3 - q) % 4]
# 빈칸이고, 청소 안 한 곳이면
if board[N_i][N_j] == 0 and cleaned[N_i][N_j] == 0:
# 위치 값 추가
temp.append([N_i,N_j])
# 청소 확인
cleaned[N_i][N_j] = 1
# 청소한 영역 +1
res += 1
# 바라보는 방향 바꾸기
dir = (dir + 3 - q) % 4
# 일단 찾아서 이동하면 더 이상 돌아볼 필요 없음
break
# 다 돌았는데 이동 못한 경우에는 temp가 비어있음
if len(temp) == 0:
# 현재 방향에서 후진하기
N_i = i+x[(dir+2)%4]
N_j = j+y[(dir+2)%4]
# 빈칸이면 temp 값 추가
if board[N_i][N_j] == 0:
temp.append([N_i, N_j])
print(res)

 


해결 방법

1. N과 M의 값이 최대 50임

 

2. 로봇 청소기가 돌아오는 경우는 후진하는 경우밖에 없음

 

1+2 => bfs 사용

 

3. for문을 탐색하면서 이동 가능한 곳을 발견하면, 더 이상 탐색을 시도할 필요 없음

(해당 위치로 바로 이동하면 됨)

 

4. 가장자리가 벽이기 때문에 index 오류 고민하지 않아도 됨(벽으로 이동하지 않는 조건을 줬을 때)


느낀 점

1. def 선언하지 않고도 bfs 사용 가능하다

 

 

ps. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.

 

오류적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.

 

혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.