โ“  ๋ฌธ์ œ

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

 

๐Ÿ›Ž๏ธ  ์•„์ด๋””์–ด

- ๊ธฐ๋ณธ bfs + ๋๊นŒ์ง€ ์ง์ง„

1. ๋‹ค์Œ ์œ„์น˜๊ฐ€ ๋ฒ”์œ„ ์•ˆ์— ์žˆ๋Š”์ง€, ์žฅ์• ๋ฌผ์ด ์žˆ๋Š” ๊ณณ์ธ์ง€ ํ™•์ธ

2-A. ๋‹ค์Œ ์œ„์น˜๋กœ ์ด๋™์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๊ณ„์† ์ด๋™ (continue)

2-B. ๋‹ค์Œ ์œ„์น˜๋กœ ์ด๋™์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ง์ „ ์œ„์น˜ queue์— append, cost + 1 (break)

 

๐Ÿ’ป  ํ’€์ด

from collections import deque

def bfs(board):
  row, col = len(board), len(board[0])

  dx = [-1, 1, 0, 0]
  dy = [0, 0, -1, 1]
  visited = [[False] * col for _ in range(row)]

  queue = deque()

  # ์ถœ๋ฐœ์  ์ฐพ๊ธฐ
  for i in range(row):
    r_index = board[i].find("R")
    if r_index != -1:
      queue.append((i, r_index, 0))
      visited[i][r_index] = True
      break

  while queue:
    x, y, cost = queue.popleft()

    if board[x][y] == "G":
      return cost

    for i in range(4):
      nx, ny = x, y

      while True:
        nx += dx[i]
        ny += dy[i]

        # ๊ณ„์† ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฉด
        if 0 <= nx < row and 0 <= ny < col and board[nx][ny] != "D":
          continue
        # ๊ฐˆ ์ˆ˜ ์—†์œผ๋ฉด ๋ฐ”๋กœ ์ง์ „ ์ž๋ฆฌ append
        else:
          if not visited[nx - dx[i]][ny - dy[i]]:
            queue.append((nx - dx[i], ny - dy[i], cost + 1))
            visited[nx - dx[i]][ny - dy[i]] = True
            break
          else:
            break

  return -1

def solution(board):
  return bfs(board)

print(solution(["...D..R", ".D.G...", "....D.D", "D....D.", "..D...."]))

 

+ Recent posts