bong-u/til

프로그래머스 - 리코쳇 로봇 (L2)

수정일 : 2023-07-11

 1from collections import deque
 2visited = []
 3vx = [0, 0, -1, 1]
 4vy = [-1, 1, 0, 0]
 5
 6def bfs(board, N, M, sp):
 7    global visited
 8    q = deque()
 9    q.append(sp+[1])
10
11    while q:
12        cy, cx, cnt = q.popleft()
13        visited[cy][cx] = True
14        for i in range(4):
15            x = cx
16            y = cy
17            while True:
18                x += vx[i]
19                y += vy[i]
20                if not (0 <= x < N and 0 <= y < M) or board[y][x] == 'D':
21                    x -= vx[i]
22                    y -= vy[i]
23                    break
24            if board[y][x] == 'G':
25                return cnt
26            if not visited[y][x]:
27                q.append([y, x, cnt+1])
28    return -1
29
30def solution(board):
31    global visited
32    N = len(board[0])
33    M = len(board)
34
35    visited = [[False] * len(board[0]) for _ in range(len(board))]
36    for i in range(M):
37        for j in range(N):
38            if board[i][j] == 'R':
39                sp = [i, j]
40
41    return bfs(board, N, M, sp)

문제

  • 2차원 리스트 board가 주어진다
  • ‘.‘은 빈공간, ‘R’은 처음위치, ‘D’는 장애물, ‘G’는 목표지점 이다
  • 장애물이나 맨 끝까지 부딪힐때까지 한 방향으로 이동한다
  • 목표지점에 정확이 멈춰설때까지 몇번 이동해야하는지 구하라, 도달할 수 없다면 -1을 반환하라
  • TC
    • input

      ["…D..R", “.D.G…”, “….D.D”, “D….D.”, “..D…."]

    • ouput

      7

해결방법

  • bfs로 풀었다
  • 이때 queue안에 cnt변수도 넣어서 몇번 이동했는지 저장한다.