Skip to content

Commit 23a0c4a

Browse files
committed
Quartz sync: Jun 2, 2025, 3:59 PM
1 parent d40124a commit 23a0c4a

File tree

21 files changed

+621
-570
lines changed

21 files changed

+621
-570
lines changed
Lines changed: 61 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
---
2-
created: 2025/3/19 16:38:39
3-
modified: 2025/4/04 11:42:10
2+
description:
3+
aliases:
4+
created: 2025-05-18
5+
modified: 2025-06-02
46
tags:
57
- review
68
---
@@ -14,96 +16,61 @@ tags:
1416
- (for문은 항상 `depth`부터)
1517
- 재귀 호출시 `depth + 1`
1618
- prev_permutation
17-
```cpp
18-
int n = 4; // 전체 개수
19-
int r = 2; // 조합 개수
20-
21-
vector<bool> v(n);
22-
fill(v.begin(), v.begin() + r, true); // 처음 r개를 true로 설정
23-
24-
cout << endl;
25-
26-
do {
27-
for (int i = 0; i < n; ++i) {
28-
if (v[i]) {
29-
cout << i << " ";
30-
}
31-
}
32-
cout << endl;
33-
} while (prev_permutation(v.begin(), v.end()));
34-
```
35-
36-
- 조합 속 순열
37-
```cpp
38-
#include <iostream>
39-
#include <algorithm>
40-
#include <vector>
41-
42-
using namespace std;
43-
44-
int main() {
45-
// Write C++ code here
46-
int n = 4; // 전체 개수
47-
int r = 4; // 조합 개수
48-
49-
// 조합속 순열
50-
vector<char> set = {'A', 'B', 'C', 'D'};
51-
vector<bool> vv(set.size());
52-
fill(vv.begin(), vv.begin() + r, true);
53-
54-
do {
55-
vector<char> temp;
56-
for (int i = 0; i < set.size(); i++){
57-
if(vv[i])
58-
{
59-
temp.push_back(set[i]);
60-
}
61-
}
62-
63-
do {
64-
for (char t: temp){
65-
cout << t << ' ' ;
66-
}
67-
cout << endl;
68-
}while (next_permutation(temp.begin(), temp.end()));
69-
70-
} while (prev_permutation(vv.begin(), vv.end()));
71-
return 0;
72-
}
73-
```
19+
- code
20+
-
21+
```cpp
22+
int n = 4; // 전체 개수
23+
int r = 2; // 조합 개수
24+
25+
vector<bool> v(n);
26+
fill(v.begin(), v.begin() + r, true); // 처음 r개를 true로 설정
27+
28+
cout << endl;
29+
30+
do {
31+
for (int i = 0; i < n; ++i) {
32+
if (v[i]) {
33+
cout << i << " ";
34+
}
35+
}
36+
cout << endl;
37+
} while (prev_permutation(v.begin(), v.end()));
38+
```
7439
- recursive
75-
- 소스 배열
76-
- 현재 배열
77-
- 타겟 조합 크기
78-
- 깊이
79-
- 종료 조건
80-
- 타겟 조합 크기에 도달
81-
- 깊이가 source_arr의 길이보다 큰 경우 (마지막)
82-
```cpp
83-
#include <iostream>
84-
#include <vector>
85-
using namespace std;
86-
87-
void combine(vector<int>& arr, vector<int>& current, int depth, int k) {
88-
if (current.size() == k) {
89-
for (int num : current) cout << num << " ";
90-
cout << "\n";
91-
return;
92-
}
93-
94-
for (int i = depth; i < arr.size(); i++) {
95-
current.push_back(arr[i]);
96-
combine(arr, current, i + 1, k);
97-
current.pop_back();
98-
}
99-
}
100-
101-
int main() {
102-
vector<int> arr = {1, 2, 3, 4};
103-
int k = 2;
104-
vector<int> current;
105-
106-
combine(arr, current, 0, k);
107-
return 0;
108-
}
109-
```
40+
- logic
41+
- 소스 배열
42+
- 현재 배열
43+
- 타겟 조합 크기
44+
- 깊이
45+
- 종료 조건
46+
- 타겟 조합 크기에 도달
47+
- 깊이가 source_arr의 길이보다 큰 경우 (마지막)
48+
-
49+
```cpp
50+
#include <iostream>
51+
#include <vector>
52+
using namespace std;
53+
54+
void combine(vector<int>& arr, vector<int>& current, int depth, int k) {
55+
if (current.size() == k) {
56+
for (int num : current) cout << num << " ";
57+
cout << "\n";
58+
return;
59+
}
60+
61+
for (int i = depth; i < arr.size(); i++) {
62+
current.push_back(arr[i]);
63+
combine(arr, current, i + 1, k);
64+
current.pop_back();
65+
}
66+
}
67+
68+
int main() {
69+
vector<int> arr = {1, 2, 3, 4};
70+
int k = 2;
71+
vector<int> current;
72+
73+
combine(arr, current, 0, k);
74+
return 0;
75+
}
76+
```
Lines changed: 42 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
---
2-
created: 2025/3/19 17:17:09
3-
modified: 2025/5/06 09:28:12
2+
description:
3+
aliases:
4+
created: 2025-05-18
5+
modified: 2025-06-02
46
tags: []
57
---
68

@@ -17,35 +19,39 @@ tags: []
1719
# pre-order DFS
1820
- 방문 자체가 목적일 때
1921
- 백트래킹 (경로 탐색, 조합, 순열)
20-
```cpp
21-
void dfs(Node* node) {
22-
if (!node) return;
23-
visit(node);
24-
dfs(node->left);
25-
dfs(node->right);
26-
}
27-
```
22+
-
23+
```cpp
24+
void dfs(Node* node) {
25+
if (!node) return;
26+
visit(node);
27+
dfs(node->left);
28+
dfs(node->right);
29+
}
30+
```
2831
- 간선 만 주어진 경우의 부모 찾기
29-
```python
30-
def dfs(u):
31-
visit[u] = true
32-
33-
for v in adj[u]:
34-
if not visit[v]:
35-
parent[v] = u
36-
dfs(v)
37-
```
32+
- ![[Tree#^129bd4]]
33+
-
34+
```python
35+
def dfs(u):
36+
visit[u] = true
37+
38+
for v in adj[u]:
39+
if not visit[v]:
40+
parent[v] = u
41+
dfs(v)
42+
```
3843
# in-order DFS
3944
- BST나 중위 수식 등, 정렬 성질 사용
4045
- BST 순회 (오름차순 정렬된 값 추출)
41-
```cpp
42-
void dfs(Node* node) {
43-
if (!node) return;
44-
dfs(node->left);
45-
visit(node);
46-
dfs(node->right);
47-
}
48-
```
46+
-
47+
```cpp
48+
void dfs(Node* node) {
49+
if (!node) return;
50+
dfs(node->left);
51+
visit(node);
52+
dfs(node->right);
53+
}
54+
```
4955

5056
# post-order DFS
5157
- 결과를 누적하거나 처리할 때
@@ -54,11 +60,12 @@ void dfs(Node* node) {
5460
- 용량 계산 (하위 폴더 다 처리 후, 부모 처리)
5561
- 트리 DP
5662
- [[Hierholzer's algorithm]] ([[Eulerian Path|오일러 경로]])
57-
```cpp
58-
void dfs(Node* node) {
59-
if (!node) return;
60-
dfs(node->left);
61-
dfs(node->right);
62-
visit(node);
63-
}
64-
```
63+
-
64+
```cpp
65+
void dfs(Node* node) {
66+
if (!node) return;
67+
dfs(node->left);
68+
dfs(node->right);
69+
visit(node);
70+
}
71+
```

content/Computer Science/1 Foundations & Theory/Algorithms/DP 유형.md

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,18 @@ modified: 2025/5/05 21:04:32
3939
- $[i, j]$ 범위에 최적 해 존재
4040
- 사칙연산 괄호, 행렬 곱, 문자열 나누기
4141
- DP 테이블의 상삼각 영역만 주로 사용 (i <= j)
42-
```cpp
43-
for (int len = 2; len <= n; ++len) {
44-
    for (int i = 0; i <= n - len; ++i) {
45-
        int j = i + len - 1;
46-
        for (int k = i; k < j; ++k) {
47-
            dp[i][j] = min/max(dp[i][j], dp[i][k] + dp[k+1][j] + cost);
48-
49-
        }
50-
    }
51-
```
42+
-
43+
```cpp
44+
for (int len = 2; len <= n; ++len) {
45+
for (int i = 0; i <= n - len; ++i) {
46+
int j = i + len - 1;
47+
for (int k = i; k < j; ++k) {
48+
dp[i][j] = min/max(dp[i][j], dp[i][k] + dp[k+1][j] + cost);
49+
50+
}
51+
}
52+
}
53+
```
5254

5355
# 케이스-분할 (분기형) DP (Case-Split DP)
5456
- 점화식이 여러개인 경우

content/Computer Science/1 Foundations & Theory/Algorithms/Graph.md

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
---
2-
created: 2025/3/19 17:07:27
3-
modified: 2025/4/03 16:10:09
2+
description:
3+
aliases:
4+
created: 2025-05-18
5+
modified: 2025-06-02
46
tags: []
57
---
68

@@ -17,17 +19,18 @@ tags: []
1719
- 무향 그래프
1820
- union-find
1921
- 간선 추가시 이미 같은 그룹이라면 사이클
20-
```cpp
21-
bool unionSet(int a, int b) {
22-
    int rootA = find(a);
23-
    int rootB = find(b);
24-
25-
    if (rootA == rootB) return true; // ❌ 이미 같은 그룹이면 사이클 발생
26-
27-
    parent[rootB] = rootA; // 두 집합을 합침
28-
    return false;
29-
}
30-
```
22+
-
23+
```cpp
24+
bool unionSet(int a, int b) {
25+
    int rootA = find(a);
26+
    int rootB = find(b);
27+
28+
    if (rootA == rootB) return true; // ❌ 이미 같은 그룹이면 사이클 발생
29+
30+
    parent[rootB] = rootA; // 두 집합을 합침
31+
    return false;
32+
}
33+
```
3134
- dfs
3235
- 방문한 노드가 다시 나왔는데, 부모가 아니라면 사이클
3336
- 방향 그래프

content/Computer Science/1 Foundations & Theory/Algorithms/Minimum Spanning Tree (MST) - 최소 신장 트리.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ modified: 2025/5/06 09:24:30
77
- 트리의 속성을 만족하는 그래프 ![[Tree#^13f174]]
88
- 최소 신장 트리
99
- 가능한 신장 트리 중에서, 간선의 가중치 합이 최소인 트리
10-
- 최소 비용으로 연결된 경로
11-
- 통신사에서 네트워크를 전국에 깔 때
12-
- 여러 도시를 통신망(케이블, 광섬유 등)으로 연결할 때, 비용을 최소화하면서 모든 도시를 연결
10+
- 최소 비용으로 연결된 경로
11+
- 통신사에서 네트워크를 전국에 깔 때
12+
- 여러 도시를 통신망(케이블, 광섬유 등)으로 연결할 때, 비용을 최소화하면서 모든 도시를 연결
1313
- ![[Kruskal's Algorithm]]
1414
- ![[Prim's Algorithm]]

0 commit comments

Comments
 (0)