From 6fde8b1f031ecdd59a3078402be646fd696fddb0 Mon Sep 17 00:00:00 2001 From: songyc macbook Date: Sun, 28 Dec 2025 22:54:57 +0900 Subject: [PATCH] logseq 20251228 --- logseq/config.edn | 8 ++- pages/알고리즘.md | 4 +- pages/영어기초 22강.md | 4 +- pages/자료구조.md | 2 +- ...최소 스패닝 트리(Minimum Spanning Tree).md | 28 +++++++++ .../크루스칼 알고리즘(Kruskal’s Algorithm).md | 52 +++++++++++++++++ pages/프림 알고리즘 (Prim’s Algorithm).md | 57 +++++++++++++++++++ pages/👩🏻‍💻코딩 팁 코드 모음_이전이전.md | 5 +- 8 files changed, 152 insertions(+), 8 deletions(-) create mode 100644 pages/최소 스패닝 트리(Minimum Spanning Tree).md create mode 100644 pages/크루스칼 알고리즘(Kruskal’s Algorithm).md create mode 100644 pages/프림 알고리즘 (Prim’s Algorithm).md diff --git a/logseq/config.edn b/logseq/config.edn index 96e33a4..bc80261 100644 --- a/logseq/config.edn +++ b/logseq/config.edn @@ -432,4 +432,10 @@ :file/name-format :triple-lowbar :journal/page-title-format "yyyy-MM-dd EEEE" :feature/enable-journals? false - :default-home {:page "📋 Index Page"}} + :default-home {:page "📋 Index Page"} + :graph/forcesettings {:link-dist 10 + :charge-strength -1000} + :graph/settings {:builtin-pages? false + :excluded-pages? true + :orphan-pages? true + :journal? false}} diff --git a/pages/알고리즘.md b/pages/알고리즘.md index caeb10a..306faa5 100644 --- a/pages/알고리즘.md +++ b/pages/알고리즘.md @@ -1,2 +1,4 @@ - [[위상 정렬(Topological Sort)]] -- [[에라토스테네스의 체]] \ No newline at end of file +- [[에라토스테네스의 체]] +- [[크루스칼 알고리즘(Kruskal’s Algorithm)]] +- [[프림 알고리즘 (Prim’s Algorithm)]] \ No newline at end of file diff --git a/pages/영어기초 22강.md b/pages/영어기초 22강.md index 3162907..1487474 100644 --- a/pages/영어기초 22강.md +++ b/pages/영어기초 22강.md @@ -96,9 +96,11 @@ deck:: Logseq/영어 문법 I know the girl of he is afraid of.(X) #+END_EXTRA - ## **► 관계대명사 - 소유격** - - I have the book. + Its cover is red. + - I have the book. + Its cover is red. id:: e64cf537-d0c2-4fc1-9a96-5bdc3b605e5b 위의 두 문장을 합쳤을 때의 겹치는 대상, 선행사, 후행사, 사용되는 관계대명사, 그리고 최종적으로 완성되는 문장은? #card + - I have the book. + Its cover is red. + id:: 694fa5ac-9559-4154-8878-0794bbe360a7 - 겹치는 대상 : The girl - 선행사 : 앞 문장에서의 the book(사물) - 후행사 : 뒷 문장에서의 its(주어 / 합쳐진 문장에서는 소유격으로 들어감) diff --git a/pages/자료구조.md b/pages/자료구조.md index 2fcf6f4..f093d7d 100644 --- a/pages/자료구조.md +++ b/pages/자료구조.md @@ -1,2 +1,2 @@ - [[분리집합(Disjoint Set) (Union Find)]] -- \ No newline at end of file +- [[최소 스패닝 트리(Minimum Spanning Tree)]] \ No newline at end of file diff --git a/pages/최소 스패닝 트리(Minimum Spanning Tree).md b/pages/최소 스패닝 트리(Minimum Spanning Tree).md new file mode 100644 index 0000000..3bf6d3f --- /dev/null +++ b/pages/최소 스패닝 트리(Minimum Spanning Tree).md @@ -0,0 +1,28 @@ +deck:: Logseq/coding tip + +- ## 1. 개념(Concept) + - **스패닝 트리(Spanning Tree)** + - 그래프의 모든 정점을 연결하는 트리를 의미하며, 정점이 $V$개면 간선은 항상 {{cloze $V-1$}}개. + id:: 6950f19e-3b2d-4a6e-a275-e24847b486be + - **최소 스패닝 트리(Minimum Spanning Tree)** + - 가중치가 있는 무방향 그래프에서 모든 정점을 연결하면서, {{cloze 간선 가중치 합}}이 최소가 되도록 고른 트리. + extra:: 스패닝 트리들 중 가중치 합이 최소인 트리 + id:: 6950f0fd-13d7-4d6b-88c8-6d2fd1f1a732 +- ## 2. 핵심 성질 + - MST는 {{cloze 사이클}}을 가지지 않는다. + id:: 6950f2db-2f04-4e8d-adab-87f0a667cb0e + - MST가 유일한지 여부는 {{cloze 가중치 중복}} 등에 따라 달라진다. + extra:: 동일 가중치가 존재한다면 경우에 따라 여러개가 존재 할 수 있음. + id:: 6950f2f2-449b-4b90-a006-09fa3c4e2647 +- ## 3. 구현 방법 및 비교 + - ### 구현 알고리즘 + - [[크루스칼 알고리즘(Kruskal’s Algorithm)]] + - 전체 간선 정렬 후 싼 것부터 추가하는 알고리즘 + - {{cloze 간선의 개수가 적을 때 :: 크루스칼 알고리즘이 더 효율적인 경우는?}} 사용하기 유리하다. + extra:: 간선이 적은 그래프를 희소 그래프 (Sparse Graph) 라고 한다. + id:: 6951147c-369e-46ca-aebb-627ca0a1d63d + - [[프림 알고리즘 (Prim’s Algorithm)]] + - 시작점에서 조금씩 영역을 넓혀가는 알고리즘 + - {{cloze 간선의 개수가 매우 많을 때 :: 프림 알고리즘이 더 효율적인 경우는?}} 사용하기 유리하다. + extra:: 간선이 매우 많은 그래프를 밀집 그래프 (Dense Graph) 라고 한다. + id:: 69511474-adb8-4eea-b8ba-617929628ee1 \ No newline at end of file diff --git a/pages/크루스칼 알고리즘(Kruskal’s Algorithm).md b/pages/크루스칼 알고리즘(Kruskal’s Algorithm).md new file mode 100644 index 0000000..9c56304 --- /dev/null +++ b/pages/크루스칼 알고리즘(Kruskal’s Algorithm).md @@ -0,0 +1,52 @@ +deck:: Logseq/coding tip + +- ## 1. 개념(Concept) + - 최소 스패닝 트리(MST)를 구하는 알고리즘. + - “가장 가벼운 간선부터 선택하되, 사이클이 생기지 않게 한다.” 라는 그리디(Greedy) 전략을 사용. + - 이를 위해 {{cloze 분리집합}}을 사용함. + extra:: [[분리집합(Disjoint Set) (Union Find)]] + id:: 6950f5ad-52f1-4df3-b495-cbfa7a6ebbec +- ## 2. 기본 구조 (Basic Structure) + - 1) 그래프의 모든 간선을 {{cloze 가중치 오름차순}} 으로 정렬한다. + id:: 6950f5f7-a85f-49a9-96c1-a06afc1af444 + - 2) 가장 가중치가 낮은 간선부터 하나씩 꺼낸다. + - 3) 선택한 간선이 연결하는 두 정점이 이미 같은 집합에 속해 있는지 확인한다. + - 같은 집합이 아니라면 :-> 간선을 선택하고 두 집합을 합친다(Union) + id:: 6950f9c6-8c02-4f9f-b860-bc9f2e768155 + - 같은 집합이라면 :-> 연결하면 사이클이 발생하므로 다음으로 넘어간다. + id:: 6950f9d9-10e3-475d-8aec-aea39babab16 + - 3) 최종적으로 간선이 {{cloze $V-1$ (정점갯수 - 1)}} 개 선택되면 종료한다. + id:: 6950f9ec-f8cb-4376-8505-3de0f465da7b +- ## 3. 코드(python) + - 입력이 V(정점의 갯수), 모든 간선들의 집합(edges)을 매개변수로 하여 + id:: 69510a18-7a5f-4a41-8113-f294b8263a21 + 크루스칼 알고리즘으로 최소 스패닝 트리를 구현하고, + 이때 총 가중치를 반환하는 함수를 구현하면? + ```python + # edges: (cost, a, b) 형태의 간선 리스트 + # parent: Union-Find용 부모 테이블이고 이미 자기 자신으로 초기회되어 있음. + # union-find 연산은 이미 구현되어 있다고 가정 + ``` + #card + - ```python + def kruskal(v, edges): + edges.sort() # 1. 가중치 순 정렬 + + total_cost = 0 + edge_count = 0 + + for cost, a, b in edges: + # 2. 사이클이 발생하지 않는 경우에만 선택 + if find(a) != find(b): + union(a, b) + total_cost += cost + edge_count += 1 + if edge_count == v - 1: # 3. 간선 V-1개 모으면 종료 + break + + return total_cost + ``` +- ## 4. 시간복잡도 + - 간선들을 정렬하고 그 간선들을 하나하나 탐색하기 때문에 간선의 정렬 시간이 가장 지배적임. + - 시간복잡도는 {{cloze $O(E\log E)$}} + id:: 69511394-6c6e-4da0-97e6-27c56fc37c71 \ No newline at end of file diff --git a/pages/프림 알고리즘 (Prim’s Algorithm).md b/pages/프림 알고리즘 (Prim’s Algorithm).md new file mode 100644 index 0000000..4d0ecb7 --- /dev/null +++ b/pages/프림 알고리즘 (Prim’s Algorithm).md @@ -0,0 +1,57 @@ +deck:: Logseq/coding tip + +- ## 1. 개념(Concept) + - 최소 스패닝 트리(MST)를 구하는 알고리즘. + - “임의의 시작 정점에서 출발하여, 현재 트리에 연결된 간선 중 가장 싼 것을 추가하며 확장한다.” 라는 전략을 사용 + - 이를 위해 {{cloze 우선순위 큐}}가 사용됨. + id:: 69511108-8006-4c0a-9452-d248f8c58ca5 + - 다익스트라(Dijkstra) 알고리즘과 비슷함. +- ## 2. 기본 구조 (Basic Structure) + - 1) 임의의 정점(vertex)을 하나 선택해서 트리에 포함시킨다. + - 2) 현재 트리에 포함된 정점들과 포함되지 않은 정점들을 연결하는 간선 중, 가중치가 가장 작은 간선을 찾는다. + - 3) 해당 간선과 연결된 새로운 정점을 트리에 추가한다. + - 4) 위의 과정을 반복하여 최종적으로 모든 정점이 트리에 포함될 때 까지 반복한다. +- ## 3. 코드(python) + - 입력이 V(정점의 갯수), 인접리스트(graph)와 시작노드(start_node)를 매개변수로 하여 + id:: 695111c8-84a0-4220-a7f4-b9f654761cec + 프림 알고리즘으로 최소 스패닝 트리를 구현하고, + 이때 총 가중치를 반환하는 함수를 구현하면? + ```python + # graph: (노드: [(비용, 인접노드)]...) + # ex) graph = [[],[(3,2),(4,5)],[(1,3)]...] + ``` + #card + - ```python + import heapq + + # graph: 인접 리스트 (노드: [(비용, 인접노드), ...]) + def prim(start_node, v, graph): + visited = [False] * (v + 1) + min_heap = [(0, start_node)] # (비용, 정점) + total_cost = 0 + count = 0 + + while min_heap: + cost, node = heapq.heappop(min_heap) + + if visited[node]: + continue + + visited[node] = True + total_cost += cost + count += 1 + + if count == v: # 모든 정점 방문 완료 + break + + # 인접 정점 중 방문 안 한 곳을 큐에 넣기 + for next_cost, next_node in graph[node]: + if not visited[next_node]: + heapq.heappush(min_heap, (next_cost, next_node)) + + return total_cost + ``` +- ## 4. 시간복잡도 + - 우선순위큐 연산이 주된 연산이므로 우선순위 큐 연산 속도에 영향을 많이 받음. + - 시간복잡도는 {{cloze $O(E\log V)$}} + id:: 69511407-a9bc-40f2-b57c-f76060ea75f1 \ No newline at end of file diff --git a/pages/👩🏻‍💻코딩 팁 코드 모음_이전이전.md b/pages/👩🏻‍💻코딩 팁 코드 모음_이전이전.md index 02a61b7..eb4ae32 100644 --- a/pages/👩🏻‍💻코딩 팁 코드 모음_이전이전.md +++ b/pages/👩🏻‍💻코딩 팁 코드 모음_이전이전.md @@ -1,7 +1,4 @@ -- -deck:: Logseq/coding tip - -- ## **❖ Javascript / Typescript** +## **❖ Javascript / Typescript** - ### **► 배열 매서드** - ### **◼︎ Array.slice(start_idx, end_idx)** id:: 68692600-551c-488b-ad74-de8145729133