본문 바로가기

728x90
반응형

# Coding/# Algorithm

(5)
[Python] 트리의 지름을 구하는 법 결론부터 말하면 트리의 지름은 임의의 한 점에서 가장 멀리 떨어져 있는 점(A)과, 해당 점(A)에서 부터 가장 멀리 떨어진 점(B) 사이의 거리(AB)이다. 즉, 한 점(n)으로 부터 DFS(n)으로 가장 먼 점(A)을 구하고, 해당 점(A)에서 DFS(A)로 가장 먼 점(B)과의 거리가 된다. 이제부터 이 이유에 대해서 생각해보자. 트리의 특징 중 사이클이 존재하지 않는다. 즉, 지나간 노드는 다시 방문할 수 없다. 이것을 기억하자. 트리는 어떤 점을 기준으로 잡아도 트리가 된다. 예를 들어보자. 위와 같은 트리가 있다고 가정해보자. 만약 3번 노드를 잡고 위로 올려서 다른 노드들이 데롱데롱 매달리게 된다고 생각해보면 아래와 같은 그림이 된다. 어느 노드를 잡고 아래로 내리게 되든지 트리와 같은 모양..
[보기 쉬운 Algorithm] 냅색(Knapsack) 알고리즘 - Python 냅색 알고리즘은 DP(Dynamic Programming)의 한 종류로 많이 쓰이는 방식 중 하나이다. 가방문제에 가장 많이 등장한다! 가방에 담을 수 있는 무게 제한이 있고, 각각의 물건은 무게와 가치가 있다. 가방의 무게를 초과하지 않게 물건을 많이 담아 최고 가치를 가지게 하는 문제이다. for i in range(1, n+1): for j in range(1, k+1): w = thing[i][0] # 물건의 무게 v = thing[i][1] # 물건의 가치 if j < w: # 현재 무게가 물건 보다 작다면 table[i][j] = table[i-1][j] # 위의 값을 그대로 else: table[i][j] = max(table[i-1][j], table[i-1][j-w]+v) https://..
[보기 쉬운 Algorithm] 깊이 우선 탐색(DFS) - Python 깊이 우선 탐색(Depth First Search)은 연결된 노드를 연속적으로 쫓아서 차례대로 탐색하는 알고리즘이다. 예를 들어 위와 같은 경우 'A'에서 탐색을 시작하면 'A'와 연결된 'B', 'D', 'F'를 먼저 찾고, 다음 'B'와 연결된 'C', 'C'와 연결된 'E'를 차례대로 탐색 후, 'D'와 연결된 'G', 다음 'F'를 찾는 것이다. 따라서 순서는 ['A', 'B', 'C', 'E', 'D', 'G', 'F']가 된다. def dfs(graph, start_node): visit = [] stack = [] stack.append(start_node) while stack: node = stack.pop(0) if node not in visit: visit.append(node) s..
[보기 쉬운 Algorithm] 너비 우선 탐색(BFS) - Python 너비 우선 탐색(Breadth First Search)은 연결된 노드를 연속적으로 쫓아서 찾는 것이 아닌 연결된 노드들을 모두 탐색한 후 그다음 연결 노드를 탐색한다. 예를 들어 위와 같은 경우 'A'에서 탐색을 시작하면 'A'와 연결된 'B', 'D', 'F'를 먼저 찾고, 다음 'B'와 연결된 'C', D와 연결된 'G', 'C'와 연결된 'E'를 찾는 것이다. 따라서 순서는 ['A', 'B', 'D', 'F', 'C', 'G', 'E']가 된다. def bfs(graph, start_node): visit = [] queue = [] queue.append(start_node) while queue: node = queue.pop(0) if node not in visit: visit.append(..
[보기 쉬운 Algorithm] 다익스트라(Dijkstra) 알고리즘 - Python '다익스트라(Dijkstra) 알고리즘'은 비용(가중치) 간선이 있는 노드 그래프의 최단 거리를 구하는 알고리즘 시간을 줄이기 위해서 파이썬 모듈 중 최소 힙을 구현할 수 있는 heapq를 사용한다. ↳ list로도 구현 가능하나 시간이 느려진다. import heapq def dijkstra(graph, start): distances = {node: float('inf') for node in graph} distances[start] = 0 queue = [] heapq.heappush(queue, [distances[start], start]) graph와 시작 점인 start를 인자로 받는다. distances는 계산된 각 점마다의 거리를 담고있다. 다익스트라 알고리즘은 거리가 짦은 값을 갱신하..

728x90
반응형