Skip to content

Commit 6804f09

Browse files
committed
Quartz sync: Jun 9, 2025, 10:10 PM
1 parent 759cce1 commit 6804f09

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1349
-1382
lines changed

content/Computer Science/1 Foundations & Theory/Algorithms/0-1 BFS.md

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,20 @@ created: 2025/5/07 14:26:48
33
modified: 2025/5/07 14:28:34
44
---
55
- bfs임으로 먼저 방문한 것이 최단 거리
6-
```cpp
7-
deque<int> dq;
8-
dist[start] = 0;
9-
dq.push_front(start);
10-
11-
while (!dq.empty()) {
12-
int u = dq.front(); dq.pop_front();
13-
for (auto [v, w] : adj[u]) {
14-
if (dist[v] > dist[u] + w) {
15-
dist[v] = dist[u] + w;
16-
if (w == 0) dq.push_front(v);
17-
else dq.push_back(v);
18-
}
19-
}
20-
}
21-
```
6+
- ```cpp
7+
deque<int> dq;
8+
dist[start] = 0;
9+
dq.push_front(start);
10+
11+
while (!dq.empty()) {
12+
int u = dq.front(); dq.pop_front();
13+
for (auto [v, w] : adj[u]) {
14+
if (dist[v] > dist[u] + w) {
15+
dist[v] = dist[u] + w;
16+
if (w == 0) dq.push_front(v);
17+
else dq.push_back(v);
18+
}
19+
}
20+
}
2221
- 거리 비교가 필요 없을 경우, 그냥 넘기기(이미 그 거리가 최적이므로)
2322
- `(dist[x][y] != -1) continue;`

content/Computer Science/1 Foundations & Theory/Algorithms/Binary Search.md

Lines changed: 53 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -9,67 +9,63 @@ modified: 2025/5/01 11:16:57
99
- 가능하면 -> 더 좋은 값으로 이동
1010
- 불가능하면 -> 가능한 값으로 이동
1111
- 값 찾기
12-
```cpp
13-
int binary_search(int[] nums, int target){
14-
int left = 0;
15-
int right = nums.length - 1;
16-
while (left <= right){
17-
int mid = left + (right - left) / 2;
18-
if (nums[mid] == target){
19-
return mid;
20-
} else if (nums[mid] < target){
21-
left = mid + 1;
22-
} else if (nums[mid] > target){
23-
right = mid - 1;
12+
- ```cpp
13+
int binary_search(int[] nums, int target){
14+
int left = 0;
15+
int right = nums.length - 1;
16+
while (left <= right){
17+
int mid = left + (right - left) / 2;
18+
if (nums[mid] == target){
19+
return mid;
20+
} else if (nums[mid] < target){
21+
left = mid + 1;
22+
} else if (nums[mid] > target){
23+
right = mid - 1;
24+
}
25+
}
26+
return -1;
2427
}
25-
}
26-
return -1;
27-
}
2828

29-
```
3029
- 왼쪽 가장자리 값 찾기
31-
```cpp
32-
int left_bound(int[] nums, int target){
33-
int left = 0;
34-
int right = nums.length - 1;
35-
while (left <= right){
36-
int mid = left + (right - left) / 2;
37-
if (nums[mid] == target){
38-
// 반환 안하고 오른쪽 가장자리를 축소하여 왼쪽 가장자리 확정
39-
right = mid - 1;
40-
} else if (nums[mid] < target){
41-
left = mid + 1;
42-
} else if (nums[mid] > target){
43-
right = mid - 1;
30+
- ```cpp
31+
int left_bound(int[] nums, int target){
32+
int left = 0;
33+
int right = nums.length - 1;
34+
while (left <= right){
35+
int mid = left + (right - left) / 2;
36+
if (nums[mid] == target){
37+
// 반환 안하고 오른쪽 가장자리를 축소하여 왼쪽 가장자리 확정
38+
right = mid - 1;
39+
} else if (nums[mid] < target){
40+
left = mid + 1;
41+
} else if (nums[mid] > target){
42+
right = mid - 1;
43+
}
44+
}
45+
// left 경계확인
46+
if (left > nums.length || nums[left] != target)
47+
return -1;
48+
return left;
4449
}
45-
}
46-
// left 경계확인
47-
if (left > nums.length || nums[left] != target)
48-
return -1;
49-
return left;
50-
}
5150

52-
```
5351
- 오른쪽 가장자리 값 찾기
54-
```cpp
55-
int right_bound(int[] nums, int target){
56-
int left = 0;
57-
int right = nums.length - 1;
58-
while (left <= right){
59-
int mid = left + (right - left) / 2;
60-
if (nums[mid] == target){
61-
// 반환 안하고 왼쪽 가장자리를 축소하여 오른쪽 가장자리 확정
62-
left = mid + 1;
63-
} else if (nums[mid] < target){
64-
left = mid + 1;
65-
} else if (nums[mid] > target){
66-
right = mid - 1;
52+
- ```cpp
53+
int right_bound(int[] nums, int target){
54+
int left = 0;
55+
int right = nums.length - 1;
56+
while (left <= right){
57+
int mid = left + (right - left) / 2;
58+
if (nums[mid] == target){
59+
// 반환 안하고 왼쪽 가장자리를 축소하여 오른쪽 가장자리 확정
60+
left = mid + 1;
61+
} else if (nums[mid] < target){
62+
left = mid + 1;
63+
} else if (nums[mid] > target){
64+
right = mid - 1;
65+
}
66+
}
67+
// right 경계확인
68+
if (right < 0 || nums[right] != target)
69+
return -1;
70+
return right;
6771
}
68-
}
69-
// right 경계확인
70-
if (right < 0 || nums[right] != target)
71-
return -1;
72-
return right;
73-
}
74-
75-
```
Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
11
- 부분집합으로 많이 사용
22
- 비트마스크 `1 << i` (i -> $2^{n}$ 까지)
33
- 각 마스크(한 조합)별 순회
4-
```cpp
5-
int total = 1 << n; // 부분집합 개수: 2^n
6-
for (int mask = 0; mask < total; mask++) {
7-
for (int i = 0; i < n; i++) {
8-
if (mask & (1 << i)) {
4+
- ```cpp
5+
int total = 1 << n; // 부분집합 개수: 2^n
6+
for (int mask = 0; mask < total; mask++) {
7+
for (int i = 0; i < n; i++) {
8+
if (mask & (1 << i)) {
9+
}
910
}
1011
}
11-
}
12-
```
1312
- 부분집합 순회 테크닉
1413
- `mask`를 제외한 남은 집합 계산용으로 효율적
15-
```cpp
16-
int mask = 7;
17-
int FULL = 1 << 8;
18-
int rest = ~mask & (FULL - 1);
19-
for (int subset = rest; subset > 0; subset = (subset - 1) & rest){
20-
cout << static_cast<bitset<8>>(subset) << endl;
21-
}
22-
```
14+
- ```cpp
15+
int mask = 7;
16+
int FULL = 1 << 8;
17+
int rest = ~mask & (FULL - 1);
18+
for (int subset = rest; subset > 0; subset = (subset - 1) & rest){
19+
cout << static_cast<bitset<8>>(subset) << endl;
20+
}

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

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
description:
33
aliases:
44
created: 2025-05-18
5-
modified: 2025-06-02
5+
modified: 2025-06-09
66
tags:
77
- review
88
---
@@ -16,9 +16,7 @@ tags:
1616
- (for문은 항상 `depth`부터)
1717
- 재귀 호출시 `depth + 1`
1818
- prev_permutation
19-
- code
20-
-
21-
```cpp
19+
- ```cpp
2220
int n = 4; // 전체 개수
2321
int r = 2; // 조합 개수
2422
@@ -35,7 +33,6 @@ tags:
3533
}
3634
cout << endl;
3735
} while (prev_permutation(v.begin(), v.end()));
38-
```
3936
- recursive
4037
- logic
4138
- 소스 배열
@@ -45,8 +42,7 @@ tags:
4542
- 종료 조건
4643
- 타겟 조합 크기에 도달
4744
- 깊이가 source_arr의 길이보다 큰 경우 (마지막)
48-
-
49-
```cpp
45+
- ```cpp
5046
#include <iostream>
5147
#include <vector>
5248
using namespace std;
@@ -72,5 +68,4 @@ tags:
7268
7369
combine(arr, current, 0, k);
7470
return 0;
75-
}
76-
```
71+
}

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

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,39 +19,33 @@ tags: []
1919
# pre-order DFS
2020
- 방문 자체가 목적일 때
2121
- 백트래킹 (경로 탐색, 조합, 순열)
22-
-
23-
```cpp
22+
- ```cpp
2423
void dfs(Node* node) {
2524
if (!node) return;
2625
visit(node);
2726
dfs(node->left);
2827
dfs(node->right);
2928
}
30-
```
3129
- 간선 만 주어진 경우의 부모 찾기
3230
- ![[Tree#^129bd4]]
33-
-
34-
```python
31+
- ```python
3532
def dfs(u):
3633
visit[u] = true
3734
3835
for v in adj[u]:
3936
if not visit[v]:
4037
parent[v] = u
4138
dfs(v)
42-
```
4339
# in-order DFS
4440
- BST나 중위 수식 등, 정렬 성질 사용
4541
- BST 순회 (오름차순 정렬된 값 추출)
46-
-
47-
```cpp
42+
- ```cpp
4843
void dfs(Node* node) {
4944
if (!node) return;
5045
dfs(node->left);
5146
visit(node);
5247
dfs(node->right);
5348
}
54-
```
5549

5650
# post-order DFS
5751
- 결과를 누적하거나 처리할 때
@@ -60,12 +54,10 @@ tags: []
6054
- 용량 계산 (하위 폴더 다 처리 후, 부모 처리)
6155
- 트리 DP
6256
- [[Hierholzer's algorithm]] ([[Eulerian Path|오일러 경로]])
63-
-
64-
```cpp
57+
- ```cpp
6558
void dfs(Node* node) {
6659
if (!node) return;
6760
dfs(node->left);
6861
dfs(node->right);
6962
visit(node);
7063
}
71-
```

content/Computer Science/1 Foundations & Theory/Algorithms/DP with Bitmask.md

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,27 @@ modified: 2025-05-18
88
- 마스크만으로 결정할 수 없는 추가 매개변수 여부에 따라 차원 추가해야한다
99
- TSP → 지금 마지막에 머물러 있는 도시 `last`
1010
- 전이(transition) 공식
11-
```cpp
12-
for each bit i not in mask:
13-
if (조건(mask, last, extra, i)) {
14-
newMask = mask | (1<<i);
15-
newLast = i; // 필요하면
16-
newExtra = update(...);// 필요하면
17-
dp[newMask][newLast][newExtra] = max/min(
18-
dp[newMask][newLast][newExtra],
19-
dp[mask][last][extra] + delta
20-
);
21-
}
22-
```
11+
- ```cpp
12+
for each bit i not in mask:
13+
if (조건(mask, last, extra, i)) {
14+
newMask = mask | (1<<i);
15+
newLast = i; // 필요하면
16+
newExtra = update(...);// 필요하면
17+
dp[newMask][newLast][newExtra] = max/min(
18+
dp[newMask][newLast][newExtra],
19+
dp[mask][last][extra] + delta
20+
);
21+
}
2322
- Bitmask DP for Assignment
24-
```cpp
25-
for(int mask = 0; mask < FULL; ++mask){
26-
// 지금까지 배정된 사람 수 = popcount(mask)
27-
int k = __builtin_popcount(mask);
28-
// 다음 사람 k 에게 할당할 일 j 탐색
29-
for(int j = 0; j < N; ++j){
30-
if( (mask & (1 << j)) == 0 ){ 
31-
int next = mask | (1 << j);
32-
dp[next] = min(dp[next], dp[mask] + cost[k][j]);
23+
- ```cpp
24+
for(int mask = 0; mask < FULL; ++mask){
25+
// 지금까지 배정된 사람 수 = popcount(mask)
26+
int k = __builtin_popcount(mask);
27+
// 다음 사람 k 에게 할당할 일 j 탐색
28+
for(int j = 0; j < N; ++j){
29+
if( (mask & (1 << j)) == 0 ){ 
30+
int next = mask | (1 << j);
31+
dp[next] = min(dp[next], dp[mask] + cost[k][j]);
32+
}
33+
}
3334
}
34-
}
35-
}
36-
```

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@ modified: 2025/5/05 21:04:32
3939
- $[i, j]$ 범위에 최적 해 존재
4040
- 사칙연산 괄호, 행렬 곱, 문자열 나누기
4141
- DP 테이블의 상삼각 영역만 주로 사용 (i <= j)
42-
-
43-
```cpp
42+
- ```cpp
4443
for (int len = 2; len <= n; ++len) {
4544
for (int i = 0; i <= n - len; ++i) {
4645
int j = i + len - 1;
@@ -50,7 +49,6 @@ modified: 2025/5/05 21:04:32
5049
}
5150
}
5251
}
53-
```
5452

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

0 commit comments

Comments
 (0)