리코쳇 로봇이라는 보드게임이 있습니다.
이 보드게임은 격자모양 게임판 위에서 말을 움직이는 게임으로, 시작 위치에서 목표 위치까지 최소 몇 번만에 도달할 수 있는지 말하는 게임입니다.
이 게임에서 말의 움직임은 상, 하, 좌, 우 4방향 중 하나를 선택해서 게임판 위의 장애물이나 맨 끝에 부딪힐 때까지 미끄러져 이동하는 것을 한 번의 이동으로 칩니다.
다음은 보드게임판을 나타낸 예시입니다....D..R .D.G... ....D.D D....D. ..D....
여기서 "."은 빈 공간을, "R"은 로봇의 처음 위치를, "D"는 장애물의 위치를, "G"는 목표지점을 나타냅니다.
위 예시에서는 "R" 위치에서 아래, 왼쪽, 위, 왼쪽, 아래, 오른쪽, 위 순서로 움직이면 7번 만에 "G" 위치에 멈춰 설 수 있으며, 이것이 최소 움직임 중 하나입니다.
게임판의 상태를 나타내는 문자열 배열 board가 주어졌을 때, 말이 목표위치에 도달하는데 최소 몇 번 이동해야 하는지 return 하는 solution함수를 완성하세요. 만약 목표위치에 도달할 수 없다면 -1을 return 해주세요.
DFS, BFS 를 활용한 미로찾기 혹은 이동관련 구현문제를 풀어 보았다면 조금더 이해하기 쉽다. 단 , 이번 문제는 상 하 좌 우 이동시에 다음을 고려해야한다.
이동하는것이 핵심이다.
나는 풀이에 함수를 나누어서 문제를 해결하였다.
board의 모서리인지 판별하는 함수이다. bool 값을 리턴한다.
bfs 로직 함수이다.
시작점과 도착점을 찾는 함수이다. 문제에서는 보드 설명이 주어지지만 시작, 도착점 은 따로 주어지지않기에 값을 추출하기위해 작성하였다.
from collections import deque
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
def solution(board):
goal, st = find_points(board)
visited = [[False for _ in range(len(board[0]))]
for _ in range(len(board))]
answer = bfs(st, goal, board, visited)
print(answer)
return answer
def examine_edge(pos, board):
y, x = pos
if x == 0 or x == len(board[0]) or y == 0 or y == len(board):
return True
return False
def bfs(st, goal, board, visited):
q = deque()
q.append([st, 0])
visited[st[0]][st[1]] = True
while q:
c_pos, depth = q.popleft()
if c_pos == goal:
return depth
else:
for i in range(4):
ny, nx = c_pos
while 0 <= nx+dx[i] < len(board[0]) and 0 <= ny+dy[i] < len(board):
# 엣지일경우 break
# d 이전일 경우 break
if board[ny+dy[i]][nx+dx[i]] == 'D':
break
nx += dx[i]
ny += dy[i]
# todo q append
if not visited[ny][nx]:
visited[ny][nx] = True
q.append([[ny, nx], depth+1])
return -1
pass
def find_points(board):
goal = []
st = []
for y in range(len(board)):
for x in range(len(board[0])):
if board[y][x] == 'R':
st = [y, x]
if board[y][x] == 'G':
goal = [y, x]
if goal and st:
return [goal, st]