09009

[프로그래머스 lv2] 리코쳇 로봇 본문

Algorithm/BFS DFS
[프로그래머스 lv2] 리코쳇 로봇
09009

문제 보기

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 해결

문제를 읽었는데 도대체 무슨 소리인지 모르겠다. 문제 자체를 이해 못해서 결국 다른 사람 풀이를 참고했다.

 

 

소스 코드

from collections import deque
def solution(board):
    answer = 0
    
    m, n = len(board), len(board[0])
    rx, ry = 0, 0
    
    dx = [0,0,-1,1]
    dy = [-1,1,0,0]
    
    for i in range(m):
        for j in range(n):
            if board[i][j] == 'R':
                rx, ry = i, j
    
    visited = [[0]*n for _ in range(m)]
    
    def bfs(x,y):
        q = deque()
        q.append((x,y))
        visited[x][y] = 1
        
        while q:
            x, y = q.popleft()
            if board[x][y] == 'G':
                return visited[x][y]
            for i in range(4):
                nx, ny = x, y
                while True:
                    nx, ny = nx + dx[i], ny + dy[i]
                    if 0 <= nx < m and 0 <= ny < n and board[nx][ny]=='D':
                        nx -= dx[i]
                        ny -= dy[i]
                        break
                    if nx < 0 or nx >= m or ny < 0 or ny >= n:
                        nx -= dx[i]
                        ny -= dy[i]
                        break
                if not visited[nx][ny]:
                    visited[nx][ny] = visited[x][y] + 1
                    q.append((nx, ny))          
        return -1
        
    answer = bfs(rx, ry) 
    if answer > 0:
        answer -= 1
    return answer