Skip to content

Commit 9975f26

Browse files
committed
7, 8주차 김별 과제
1 parent 93e5325 commit 9975f26

File tree

3 files changed

+145
-0
lines changed

3 files changed

+145
-0
lines changed

7주차 - 최단경로/byul.md

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# 최단경로 알고리즘이란
2+
3+
그래프에서 간선의 가중치의 합이 최소가 되는 경로를 찾는 알고리즘
4+
5+
# 최단 경로 문제 종류
6+
7+
- 단일 출발 (single-source) 최단 경로
8+
- 하나의 정점에서 출발하여 나머지 모든 정점 까지의 최단 경로를 찾는 문제
9+
- 단일 도착 (single-destination) 최단 경로
10+
- 모든 정점에서 출발하여 어떤 하나의 정점까지의 최단 경로를 찾는 문제
11+
- 그래프 내의 간선들을 뒤집으면 단일 출발 최단거리 문제로 바뀔 수 있다.
12+
- 단일 쌍(single-pair) 최단 경로
13+
- 모든 정점 쌍들 사이의 최단 경로를 찾는 문제
14+
15+
# 최단경로 알고리즘 3개 표로 비교하기
16+
17+
| 특징 | 다익스트라 (Dijkstra) | 플로이드-워셜 (Floyd-Warshall) | 벨만-포드 (Bellman-Ford) |
18+
| -------------------- | ------------------------------------------------- | --------------------------------------- | ------------------------------------------------- |
19+
| **용도** | 단일 시작점 최단 경로 | 모든 쌍 최단 경로 | 단일 시작점 최단 경로 |
20+
| **그래프 유형** | 가중치가 비음수 | 음수 사이클이 없는 그래프 | 음수 가중치 허용 (음수 사이클 탐지 가능) |
21+
| **시간 복잡도** | \(O((V + E) \log V)\) (우선순위 큐 사용 시) | \(O(V^3)\) | \(O(V \cdot E)\) |
22+
| **공간 복잡도** | \(O(V + E)\) | \(O(V^2)\) | \(O(V)\) |
23+
| **음수 가중치** | 허용하지 않음 | 허용하지만 음수 사이클은 없음 | 허용 |
24+
| **음수 사이클 탐지** | 불가능 | 불가능 | 가능 |
25+
| **알고리즘 유형** | 탐욕 알고리즘 | 동적 프로그래밍 | 동적 프로그래밍 |
26+
| **적용 사례** | 네트워크 라우팅, 길 찾기 | 모든 정점 간의 최단 경로 계산 | 금융 모델, 네트워크에서의 비용 최적화 문제 |
27+
| **입력** | 단일 시작 정점 | 모든 정점 쌍 | 단일 시작 정점 |
28+
| **출력** | 시작 정점으로부터 각 정점까지의 최단 거리 및 경로 | 모든 정점 쌍 간의 최단 거리와 경로 행렬 | 시작 정점으로부터 각 정점까지의 최단 거리 및 경로 |
29+
30+
# 다익스트라 알고리즘 to Javascript
31+
32+
```javascript
33+
//그래프 배열
34+
const graph = Array.from({ length: n + 1 }, () => []);
35+
//거리 배열
36+
const d = Array.from({ length: n + 1 }, () => Infinity);
37+
38+
//그래프 구성
39+
for (const v of arr) {
40+
const [from, to, dist] = v;
41+
graph[from].push([to, dist]);
42+
}
43+
44+
//우선순위 큐 init
45+
const queue = [];
46+
//시작점과 weight를 큐에 푸시한다.
47+
queue.push([start, 0]);
48+
d[start] = 0;
49+
50+
while (queue.length !== 0) {
51+
const [curNode, dist] = queue.shift(); //큐에서 가장 최소 요소를 꺼낸다.
52+
53+
if (d[curNode] < dist) continue; //최소 경로를 찾는 부등호
54+
55+
for (const v of graph[curNode]) {
56+
// 인접 정접 for loop
57+
const node = v[0];
58+
// 거리 계산
59+
const cost = dist + v[1];
60+
61+
if (cost < d[node]) {
62+
//계산 중인 경로가 최소경로라면 큐에 푸시
63+
queue.push([node, cost]);
64+
queue.sort((a, b) => a[1] - b[1]);
65+
d[node] = cost;
66+
}
67+
}
68+
}
69+
```
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# 누적합? Prefix Sum
2+
3+
`누적합`이란 수열에서 구간의 합을 누적한 값을 말하는 것이다.
4+
5+
예를 들어,
6+
7+
```javascript
8+
const arr = [1, 2, 3, 4, 5];
9+
```
10+
11+
인 배열이 있다면,
12+
<br>arr의 누적합 배열은<br>
13+
14+
```javascript
15+
const psum = [1, 3, 6, 10, 15];
16+
```
17+
18+
로 나타낼 수 있다.
19+
20+
# 누적합 알고리즘?
21+
22+
```javascript
23+
psum[i] = psum[i - 1] + arr[i];
24+
```
25+
26+
# 누적합 알고리즘을 사용했을 때 이점?
27+
28+
- `시간 복잡도`를 줄일 수 있다.
29+
```
30+
누적합 알고리즘을 사용하면, for 이중루프로 실행 시 시간 복잡도 O(n*2)를 <br>
31+
O(n)으로 줄일 수 있다.
32+
```
33+
- `구간합`을 구하는 것이 쉬워진다.
34+
35+
```
36+
arr의 left 인덱스 ~ right 인덱스 구간의 합을 구하고자 할 때,
37+
arr[right] - arr[left-1] 로 구간의 합을 구할 수 있다.
38+
```
39+
40+
# 2차원 배열의 구간합
41+
42+
![](./dw.png)
43+
44+
노랑의 구간합은
45+
46+
```
47+
전체 - (빨+파) - (빨+초) + 빨
48+
```
49+
50+
으로 구한다.
51+
52+
# 백준 11659 구간 합 구하기4
53+
54+
```javascript
55+
const [N, M] = input[0].split(" ").map(Number); // N: 수의 개수, M: 합을 구해야 하는 횟수
56+
const numbers = input[1].split(" ").map(Number); // N개의 수
57+
58+
// 누적 합 배열 생성
59+
const prefixSum = Array(N + 1).fill(0);
60+
for (let i = 1; i <= N; i++) {
61+
prefixSum[i] = prefixSum[i - 1] + numbers[i - 1];
62+
}
63+
64+
// 결과를 저장할 배열
65+
let result = [];
66+
67+
// 각 쿼리에 대해 구간 합 계산
68+
for (let k = 0; k < M; k++) {
69+
const [i, j] = input[k + 2].split(" ").map(Number);
70+
const sum = prefixSum[j] - prefixSum[i - 1];
71+
result.push(sum);
72+
}
73+
74+
// 결과 출력
75+
console.log(result.join("\n"));
76+
```
477 KB
Loading

0 commit comments

Comments
 (0)