(전공복습) 데이터과학 4. 시각화
차례
처음엔 BFS로 접근하되, 모든 경우의 수를 전부 구해야 하므로 visited
배열 없이 접근했다.
그런데 계속 잘 가다가 TLE가 떠서, 확인해 보니 추가 시간 없음이라 “파이썬” 당한 거였다.
BFS로 푸려고 최적화를 위한 온갖 노력을 다 해보았지만, 안 되는 것 같아 포기하고 DP로 풀었다.
DP로 푸는 아이디어는 다음과 같다:
파이프는 오직 한 방향(우측/하단)으로만 이동할 수 있으며 되돌아가지 못한다. 즉 배열의 이전 값이 이후 값에 영향을 미치지 못한다.
따라서 특정 좌표까지 가는 방법의 수는 그 이전 좌표까지 가는 방법의 수의 합으로 표현할 수 있다.
이때, DP 배열은 3차원(x, y축, 방향)으로 총 N * N * 3
크기가 된다(혹은 2차원 배열에 값이 3개씩 들어 있다고 봐도 된다. 그게 그거지만).
n = int(input())
arr = tuple([tuple(input().split()) for _ in range(n)])
dp = [[[0] * 3 for _ in range(n)] for _ in range(n)] # 0: 가로 / 1: 세로 / 2: 대각선
dp[0][1][0] = 1 # 처음 파이프 끝의 위치
# 맨 윗 줄의 파이프 이동 배열
for i in range(1, n):
if arr[0][i] == '1':
break
dp[0][i][0] = 1
# 본격적인 DP
for i in range(1, n):
for j in range(1, n):
if arr[i][j] == '1':
continue
dp[i][j][0] = dp[i][j-1][0] + dp[i][j-1][2]
dp[i][j][1] = dp[i-1][j][1] + dp[i-1][j][2]
if '1' in (arr[i-1][j], arr[i][j-1]):
continue
dp[i][j][2] = dp[i-1][j-1][0] + dp[i-1][j-1][1] + dp[i-1][j-1][2]
print(sum(dp[n-1][n-1]))
문제 링크 문제 링크
개요 선형적인 자료구조에서는 값에 접근하는 데에 \(O(1)\)이면 충분하지만, 대신 부분합을 구하는 데에는 \(O(N)\)이 필요하다. 그렇다면 이 자료구조를 이진 트리로 구성하면 어떨까? 값에 접근하는 데에 걸리는 시간이 \(O(\lg N)\)으로 늘어나지만 대신 부분합을 구하...
개요 다익스트라 알고리즘과 함께 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 다익스트라 알고리즘보다 느리지만, 음수 가중치 간선이 있어도 작동하며, 음수 가중치 사...
개요 다익스트라 알고리즘은 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘 중 하나이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 단, 다익스트라 알고리즘은 음수 가중치 엣지를 허용하지 않는다. 이 경우에는 벨만-...