ROR 게임은 두 팀으로 나누어서 진행하며, 상대 팀 진영을 먼저 파괴하면 이기는 게임입니다.
따라서, 각 팀은 상대 팀 진영에 최대한 빨리 도착하는 것이 유리합니다.
지금부터 당신은 한 팀의 팀원이 되어 게임을 진행하려고 합니다.
다음은 5 x 5 크기의 맵에, 당신의 캐릭터가 (행: 1, 열: 1) 위치에 있고, 상대 팀 진영은 (행: 5, 열: 5) 위치에 있는 경우의 예시입니다.
위 그림에서 검은색 부분은 벽으로 막혀있어 갈 수 없는 길이며, 흰색 부분은 갈 수 있는 길입니다.
캐릭터가 움직일 때는 동, 서, 남, 북 방향으로 한 칸씩 이동하며, 게임 맵을 벗어난 길은 갈 수 없습니다.
아래 예시는 캐릭터가 상대 팀 진영으로 가는 두 가지 방법을 나타내고 있습니다.
첫 번째 방법은 11개의 칸을 지나서 상대 팀 진영에 도착했습니다.
두 번째 방법은 15개의 칸을 지나서 상대팀 진영에 도착했습니다.
위 예시에서는 첫 번째 방법보다 더 빠르게 상대팀 진영에 도착하는 방법은 없으므로, 이 방법이 상대 팀 진영으로 가는 가장 빠른 방법입니다.
만약, 상대 팀이 자신의 팀 진영 주위에 벽을 세워두었다면 상대 팀 진영에 도착하지 못할 수도 있습니다.
예를 들어, 다음과 같은 경우에 당신의 캐릭터는 상대 팀 진영에 도착할 수 없습니다.
게임 맵의 상태 maps가 매개변수로 주어질 때, 캐릭터가 상대 팀 진영에 도착하기 위해서 지나가야 하는 칸의 개수의 최솟값을 return 하도록 solution 함수를 완성해주세요. 단, 상대 팀 진영에 도착할 수 없을 때는 -1을 return 해주세요.
제한사항
처음에는 dfs로 접근하려 했다..
def func(maps, x, y, move_x=0, move_y=0):
cur_x, cur_y = x + move_x, y + move_y
if cur_x< 0 or cur_y < 0 or cur_x >= len(maps) or cur_y >= len(maps[0]) or maps[cur_x][cur_y] == 0:
return
if maps[cur_x][cur_y] == 1 or maps[cur_x][cur_y] > maps[x][y] + 1:
maps[cur_x][cur_y] = maps[x][y] + 1
func(maps, cur_x, cur_y, 1, 0)
func(maps, cur_x, cur_y, -1, 0)
func(maps, cur_x, cur_y, 0, 1)
func(maps, cur_x, cur_y, 0, -1)
return maps
#dfs 재귀
def solution(maps):
answer = 0
n, m = len(maps), len(maps[0])
func_map = func(maps, 0, 0)
if func_map[n-1][m-1] == 1:
answer = -1
else:
answer = func_map[n-1][m-1] -1
return answer
그런데 test case는 통과하더라도 효율성에서 하나도 통과하지 못해 bfs로 다시 풀었고 해결 완료!
from collections import deque
#bfs
def solution(maps):
answer = 0
n,m = len(maps) - 1, len(maps[0]) - 1
moves = [(0,1), (1,0), (-1,0), (0,-1)]
q = deque()
q.append((0,0))
while q:
x, y = q.popleft()
for move in moves:
cur_x, cur_y = x + move[0], y + move[1]
if cur_x < 0 or cur_x > n or cur_y < 0 or cur_y > m:
continue
if maps[cur_x][cur_y] == 1:
maps[cur_x][cur_y] = maps[x][y] + 1
q.append((cur_x, cur_y))
answer = maps[n][m]
if answer == 1:
answer =- 1
return answer
잘 보면 dfs에는 마지막 종료 조건에 maps[cur_x][cur_y] > maps[x][y] + 1가 있는데 혹시 더 먼길을 먼저 돌아왔을 경우 최소값을 비교해서 다음 칸을 진행하려고 하다보니 생긴 조건이다
이에 대해 bfs에서는 어짜피 주변 노드에서 최소점으로 진행하기 때문에 저 조건이 없어도 잘 작동함을 알 수 있다!