(전공복습) 데이터과학 4. 시각화
차례
DFS 길찾기라는 발상은 금방 떠올렸는데, 구현에 있어서 놓친 게 있었던 문제.
일단 기본적인 아이디어는 DFS 백트래킹을 활용해서 가장 먼 거리를 찾는 것이다.
구현이 크게 어렵지는 않아서 금방 코드를 짰는데, pypy에서도 TLE가 떴다.
잘 생각해보니, 방문 처리를 하는 배열을 딕셔너리로 짠 게 문제가 되겠다 싶었다.
흔히 딕셔너리에서 원소 참조의 시간복잡도는 \(O(1)\)이라고 말하지만, 해시로 구현된 딕셔너리 특성 상 해시 충돌이 발생하면 시간복잡도는 \(O(N)\)까지 늘어날 수 있다.
또한 해싱에 들어가는 오버헤드를 감안하면, 같은 \(O(1)\)이라도 리스트의 참조가 더 빠르다고 보아야 한다.
방문 처리를 딕셔너리 대신 리스트로 하도록 변경한 후 AC를 맞을 수 있었다.
from sys import stdin
input = stdin.readline
r, c = map(int, input().split())
board = [input().rstrip() for _ in range(r)]
visited = [0] * 26
# 65는 A의 아스키코드
visited[ord(board[0][0]) - 65] = 1
def dfs(i, j, ans):
ret = ans
for di, dj in ((-1, 0), (1, 0), (0, -1), (0, 1)):
if 0<=i+di<r and 0<=j+dj<c and not visited[ord(board[i+di][j+dj]) - 65]:
visited[ord(board[i+di][j+dj]) - 65] = 1
ret = max(ret, dfs(i+di, j+dj, ans + 1))
# 백트래킹이므로 지나간 길을 돌아올 때 방문 처리를 취소해야 함
visited[ord(board[i+di][j+dj]) - 65] = 0
return ret
print(dfs(0, 0, 1))
문제 링크 문제 링크
개요 선형적인 자료구조에서는 값에 접근하는 데에 \(O(1)\)이면 충분하지만, 대신 부분합을 구하는 데에는 \(O(N)\)이 필요하다. 그렇다면 이 자료구조를 이진 트리로 구성하면 어떨까? 값에 접근하는 데에 걸리는 시간이 \(O(\lg N)\)으로 늘어나지만 대신 부분합을 구하...
개요 다익스트라 알고리즘과 함께 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 다익스트라 알고리즘보다 느리지만, 음수 가중치 간선이 있어도 작동하며, 음수 가중치 사...
개요 다익스트라 알고리즘은 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘 중 하나이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 단, 다익스트라 알고리즘은 음수 가중치 엣지를 허용하지 않는다. 이 경우에는 벨만-...