Algorithm/프로그래머스_생각정리

프로그래머스_level 2_리코쳇 로봇(python)

코친남 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 값은 변할텐데. 이렇게 변수가 계속 변할 때 변수의 변화에 대해 주의하자