알고리즘/프로그래머스 문제풀이

[프로그래머스] lv.2 리코쳇 로봇 python 풀이

감자156 2023. 5. 26. 17:38
반응형

풀이

bfs 문제인데, 다음 위치를 큐에 채워주는 부분에서,

장애물을 만나거나 범위 끝까지 도착할때까지 미끄러지는 것을 find_next로 구현하여 다음위치를 찾음.

 

문제

https://school.programmers.co.kr/learn/courses/30/lessons/169199

 

코드

import collections

def find_next(x,y,tx,ty, board):
    while True:
        nx, ny = x, y

        x += tx
        y += ty

        if not 0<=x<len(board) or not 0<=y<len(board[0]) or board[x][y] == 'D':
            return nx, ny    

def solution(board):
    visited = [[0 for _ in range(len(board[0]))] for _ in range(len(board))]

    for i in range(len(board)):
        for j in range(len(board[0])):
            if board[i][j] == 'R':
                rx, ry = i,j
            if board[i][j] == 'G':
                gx, gy = i,j     

    move = {(-1,0), (0,1), (1,0), (0,-1)}

    q = collections.deque()
    q.append((rx,ry,0))
    visited[rx][ry] = 1

    while q:
        x,y,cnt = q.popleft()

        if x == gx and y == gy:
            return cnt

        for tx,ty in move:
            nx, ny = find_next(x,y,tx,ty,board)

            if 0<=nx<len(board) and 0<=ny<len(board[0]) and board[nx][ny] != 'D' and visited[nx][ny] == 0:
                q.append((nx,ny,cnt+1))
                visited[nx][ny] = 1

    return -1
반응형