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

박형진·2023년 3월 26일
0

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


1. 코드

from collections import deque


def solution(board):
    def up(x, y):
        while True:
            if x == -1 or board[x][y] == 'D':
                return x+1, y
            else:
                x -= 1

    def down(x, y):
        while True:
            if x == N or board[x][y] == 'D':
                return x-1, y
            else:
                x += 1

    def left(x, y):
        while True:
            if y == -1 or board[x][y] == 'D':
                return x, y+1
            else:
                y -= 1

    def right(x, y):
        while True:
            if y == M or board[x][y] == 'D':
                return x, y-1
            else:
                y += 1

    N, M = len(board), len(board[0])
    maps = [[False] * M for _ in range(N)]
    q = deque()
    for i in range(N):
        for j in range(M):
            if board[i][j] == 'R':
                q.append((i, j, 0))
            if board[i][j] == 'G':
                end_x, end_y = i, j

    while q:
        x, y, cnt = q.popleft()
        for i in range(4):
            if i == 0:
                nx, ny = up(x, y)
            elif i == 1:
                nx, ny = down(x, y)
            elif i == 2:
                nx, ny = left(x, y)
            elif i == 3:
                nx, ny = right(x, y)

            if not maps[nx][ny]:
                maps[nx][ny] = cnt+1
                q.append((nx, ny, cnt+1))

    if maps[end_x][end_y]:
        return maps[end_x][end_y]
    else:
        return -1

2. 후기

일반적인 상하좌우 방향으로 한 칸씩 이동하는 BFS 문제에서 이동 조건만 변경된 문제이다.

  1. 이동거리를 저장할 2차원 배열의 시작점은 0, 나머지는 False 값으로 초기화한다.
  2. 방문할 좌표값이 False 일 경우 방문하고 현재 좌표 + 1값으로 갱신 후 큐에 좌표를 추가한다.
profile
안녕하세요!

0개의 댓글