소스 코드
# 방향 이동, 북 동 남 서 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. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.
오류나 적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.
혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.
'코딩 문제해결 > 문제 풀이.백준' 카테고리의 다른 글
[BOJ/백준 코딩] 경사로 - PYTHON #14890 (0) | 2021.02.05 |
---|---|
[BOJ/백준 코딩] 물통 - PYTHON #2251 (0) | 2021.02.04 |
[BOJ/백준 코딩] 양 - PYTHON #3184 (0) | 2021.02.01 |
[BOJ/백준 코딩] 보물 - PYTHON #1026 (0) | 2021.01.31 |
[BOJ/백준 코딩] 숫자판 점프 - PYTHON #2210 (0) | 2021.01.31 |