(전공복습) 데이터과학 4. 시각화
차례
BFS 최단거리 문제.
그런데, 최대 k
번 체스의 나이트처럼 움직일 수 있다.
처음엔 그냥 그 경우만 추가해서 BFS를 했는데 틀렸다.
생각해보면, 평범하게 visited
리스트를 사용해서 방문 여부를 검사하면, 아래와 같은 TC에서 잘못된 답을 내놓는다.
1
5 5
0 0 1 1 1
1 0 1 1 1
1 0 1 1 1
1 1 1 1 1
1 1 0 0 0
먼저 말처럼 움직여서(이하 ‘점프’라고 칭한다) (2, 1)로 움직이면, 아래로 넘어갈 수 없으므로 더이상 갈 수 없다.
목표지점에 도달하기 위해서는 우선 (2, 1)까지 원숭이처럼 움직인 후, (4, 2)로 점프해야 한다.
하지만, 이미 점프해서 (2, 1)에 방문했기 때문에 visited[2][1]
이 True
가 되면서, 원숭이처럼 움직여서는 그곳에 갈 수 없게 된다.
이를 막기 위해, visited
에는 방문 여부 대신 방문했을 때 남은 점프 횟수를 기록한다.
만약, 노드를 방문했을 때, 이전보다 남은 점프 횟수가 더 많다면, 해당 방법으로만 갈 수 있는 길이 있을 수 있으므로 이를 갱신한다.
그 외에는 다른 BFS 문제와 동일하다.
#!python
from sys import stdin
from collections import deque
input = stdin.readline
k = int(input())
w, h = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(h)]
# visited[i][j]는 (i, j)에서 남은 k(말처럼 점프할 수 있는 횟수)가 몇인지 기록
# 이미 방문했지만 나중에 써야 할 점프를 이미 써버린 경우를 방지하기 위함
visited = [[-1 for _ in range(w)] for _ in range(h)]
q = deque([(0, 0, 0, k)])
# BFS
while q:
# x, y : 원숭이의 좌표
# i : 지금까지 이동횟수
# j : 남은 말처럼 움직일 수 있는 횟수
x, y, i, j = q.popleft()
# 이미 더 많은 남은 점프 횟수를 가지고 방문한 적이 있거나 막혀 있으면 패스
if visited[x][y] >= j or board[x][y]:
continue
# 만약 종점이면 답 출력하고 탈출
if (x, y) == (h - 1, w - 1):
print(i)
break
# visited[x][y]를 남은 점프 횟수로 갱신
visited[x][y] = j
# 원숭이처럼 한칸 움직이는 경우
for dx, dy in [(1, 0), (0, 1), (-1, 0), (0, -1)]:
if not (0 <= x + dx < h and 0 <= y + dy < w):
continue
q.append((x+dx, y+dy, i+1, j))
# 말처럼 움직일 수 있는 횟수가 남아야 아래 코드 실행
if not j:
continue
# 말처럼 점프하는 경우
for dx, dy in [(-2, -1), (2, -1), (-2, 1), (2, 1), (1, 2), (-1, 2), (1, -2), (-1, -2)]:
if not (0 <= x + dx < h and 0 <= y + dy < w):
continue
q.append((x+dx, y+dy, i+1, j-1))
# 방법이 없는 경우 -1 출력
else:
print(-1)
문제 링크 문제 링크
개요 선형적인 자료구조에서는 값에 접근하는 데에 \(O(1)\)이면 충분하지만, 대신 부분합을 구하는 데에는 \(O(N)\)이 필요하다. 그렇다면 이 자료구조를 이진 트리로 구성하면 어떨까? 값에 접근하는 데에 걸리는 시간이 \(O(\lg N)\)으로 늘어나지만 대신 부분합을 구하...
개요 다익스트라 알고리즘과 함께 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 다익스트라 알고리즘보다 느리지만, 음수 가중치 간선이 있어도 작동하며, 음수 가중치 사...
개요 다익스트라 알고리즘은 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘 중 하나이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 단, 다익스트라 알고리즘은 음수 가중치 엣지를 허용하지 않는다. 이 경우에는 벨만-...