소스 코드

# 방향 이동, 북 동 남 서
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. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.

 

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

 

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