-
프로그래머스_level 2_리코쳇 로봇(python)Algorithm/프로그래머스_생각정리 2023. 3. 19. 14:25
※ 접근법
1. 그래프가 주어지고 최소의 경우의 수를 구해야 하니 탐색을 떠올렸다.
2. 보드의 크기가 최대 100, 100 총 만 칸이니 dfs로 탐색할 시 RecursionError가 발생할 것 같아 bfs로 풀기로 했다.
※ 풀이
1. 미로에서 상하좌우로 이동하는데 빙판길이라고 생각했다.
2. 장애물("D"), 벽("그래프 범위를 벗어나기 전 가장자리")을 만나기전 까지 계속 미끄러진다.
3. 목표지점을 만났다면 바로 리턴해서 함수를 종료해준다. (바로 리턴해줄 수 있는 이유는 밑에 나온다.)
4. 벽이나 장애물을 만났는데 count > 0이면서 전에 방문했을 때보다 더 작은 횟수로 방문했을 시 큐에 추가해주고 visited값을 갱신해준다. (이렇게 최소 횟수의 방법만 큐에 들어오니 목표지점 도착했을 때도 최소 방법으로 도착했을 것이고 그래서 바로 리턴해주는 것이다.)
from collections import deque def bfs(r,c,row,col,data): visited = [[float("inf")] * col for i in range(row)] dx = [-1,1,0,0] dy = [0,0,-1,1] q = deque() q.append((r,c)) visited[r][c] = 0 while q: x,y = q.popleft() fx,fy = x,y for i in range(4): count = 0 x,y = fx,fy # 반복을 할 때마다 x랑 y가 변한채로 진행이 되니 첫 시작을 다시 넣어줘야 한다. while True: nx = x + dx[i] ny = y + dy[i] if 0 > nx or nx == row or 0 > ny or ny == col or data[nx][ny] == 'D': if data[x][y] == 'G': return visited[fx][fy] + 1 if count > 0 and visited[fx][fy] + 1 < visited[x][y] : q.append((x,y)) visited[x][y] = visited[fx][fy] + 1 break x,y = nx,ny count += 1 return -1 def solution(board): row = len(board) col = len(board[1]) for i in range(row): for j in range(col): if board[i][j] == "R": return bfs(i,j,row,col,board)
※ 회고
큐에서 x,y를 팝하고 fx,fy에다가 기억만 시켜놓고 다시 매 반복 때마다 x,y에다가 넣어주지 않았다. 반복 할 때마다 x,y 값은 변할텐데. 이렇게 변수가 계속 변할 때 변수의 변화에 대해 주의하자
'Algorithm > 프로그래머스_생각정리' 카테고리의 다른 글
프로그래머스_광물캐기_level2(python) (0) 2023.03.26 프로그래머스_두 큐 합 같게 만들기_level2(python) (0) 2023.03.23 프로그래머스_주차 요금 계산(python) (0) 2022.12.08 프로그래머스 우박수열_정적분(python) (0) 2022.12.06 프로그래머스 택배상자(python) (0) 2022.10.18