Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
0321f80
Create [승헌]API.md
AdamSeungheonShin Sep 30, 2024
13b5736
Create [승헌]CICD.md
AdamSeungheonShin Oct 18, 2024
e81d96b
Create [승헌]Class.md
AdamSeungheonShin Oct 25, 2024
96eed2c
Create [승헌]Overloading&Overriding.md
AdamSeungheonShin Nov 2, 2024
2846cf5
Create [승헌]Compile.md
AdamSeungheonShin Nov 2, 2024
13ef032
Create [승헌]DesignPatterns.md
AdamSeungheonShin Nov 7, 2024
a7d698a
Create [승헌]Library&Framework.md
AdamSeungheonShin Nov 7, 2024
e670470
Rename [승헌]DesignPatterns.md to [승헌]DesignPatterns.md
AdamSeungheonShin Nov 7, 2024
478a59b
Rename [승헌]Library&Framework.md to [승헌]Library&Framework.md
AdamSeungheonShin Nov 7, 2024
4c65f92
Create [승헌]Singleton.md
AdamSeungheonShin Nov 11, 2024
7eee918
Create [승헌]Factory&Iterator.md
AdamSeungheonShin Nov 18, 2024
2a9dce5
Create [승헌]DI&DIP.md
AdamSeungheonShin Nov 18, 2024
bb39abe
Update [승헌]DI&DIP.md
AdamSeungheonShin Dec 2, 2024
5fa64a5
Create [승헌]Flux.md
AdamSeungheonShin Dec 2, 2024
b84f5e5
Create [승헌]Context.md
AdamSeungheonShin Dec 2, 2024
e424793
Merge branch 'main' into 승헌
cindycho0423 Dec 3, 2024
c2c46bd
Create [승헌]NetworkBasic.md
AdamSeungheonShin Dec 9, 2024
eb8d3eb
Create [승헌]Topology.md
AdamSeungheonShin Dec 16, 2024
8765ae3
Create [승헌]Casting.md
AdamSeungheonShin Dec 16, 2024
9219b3a
Create [승헌]AreaNetworks.md
AdamSeungheonShin Dec 24, 2024
9d2b0d6
Create [승헌]TCPIP.md
AdamSeungheonShin Dec 24, 2024
5695de4
Update [승헌]TCPIP.md
AdamSeungheonShin Jan 8, 2025
239d910
Create [승헌]Routing.md
AdamSeungheonShin Jan 8, 2025
a3c171d
Create [승헌]IP.md
AdamSeungheonShin Jan 8, 2025
0822f44
Merge branch 'main' into 승헌
cindycho0423 Jan 12, 2025
c6b72cd
Create [승헌]IP-Addressing.md
AdamSeungheonShin Jan 13, 2025
fc3bd40
Create [승헌]HTTPHeader.md
AdamSeungheonShin Jan 13, 2025
215832a
Create [승헌]HTTP_Deepdive.md
AdamSeungheonShin Jan 21, 2025
d60f79a
Create [승헌]Cache.md
AdamSeungheonShin Jan 31, 2025
2057e52
Create [승헌]데이터베이스기본.md
AdamSeungheonShin May 22, 2025
aa067b4
Update [승헌]데이터베이스기본.md
AdamSeungheonShin May 29, 2025
5701157
Merge: merge branch 'main' into 승헌
AdamSeungheonShin May 29, 2025
ce99525
데이터베이스 기본 - 관계, 키
AdamSeungheonShin Jun 4, 2025
edafe82
ERD
Jun 24, 2025
87d2f78
Merge branch 'main' into 승헌
Jun 24, 2025
3643b87
데이터베이스 기본, 조인
Jun 30, 2025
048c798
Merge branch 'main' into 승헌
Jul 7, 2025
067d3f3
조인알고리즘
Jul 7, 2025
a9d1b58
인덱싱
Jul 21, 2025
ae4d6b5
데이터베이스 정규화와 이상현상
Aug 4, 2025
2ecc6a6
[승헌] 자료구조: 연결리스트
Sep 30, 2025
6bf46bb
Merge branch 'main' into 승헌
Sep 30, 2025
dac0c16
Merge branch 'main' into 승헌
Oct 15, 2025
b25eb41
[승헌] 자료구조: 스택과 큐, 그래프
Oct 15, 2025
d0923b5
[승헌] 자료구조: 트리
Oct 31, 2025
495d1fb
[승헌] 자료구조: 인접행렬
Oct 31, 2025
379cd3c
[승헌] 자료구조: 인접리스트
Oct 31, 2025
cdeb840
[승헌] 자료구조: Map & Set
Oct 31, 2025
4fafd75
[승헌] 자료구조: 해시테이블 & 힙
Nov 3, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
158 changes: 158 additions & 0 deletions data-structure/승헌/AdjacencyList.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
## 인접리스트(adjacency list)

그래프를 표현하는 주요 방법 중 하나

그래프에서 정점과 간선의 관계를 연결리스트로 나타냄

### 인접리스트란?

각 정점에 연결된 정접들의 리스트를 저장하는 방식

```jsx
// 그래프:
// 0 - 1 - 2
// | |
// 3 - 4

// 인접리스트 표현:
0: [1, 3]
1: [0, 2, 4]
2: [1]
3: [0, 4]
4: [1, 3]
```

### 인접리스트가 아닌 vector도 되는 이유?

> 각 정점마다 연결된 정점들을 저장

위 개념에 따르면, 연결리스트던 동적배열(vector)을 사용하던 구조적으로 같은 역할을 함

아래와 같은 이유로 vector를 더 선호함

- 캐시 지역성이 좋음
- 구현이 간단
- 랜덤접근 가능

### 연결리스트의 시간복잡도

- n번째 인덱스에 삽입, 삭제 : O(1)
- 마지막 요소에 삽입, 삭제 : O(1)
- 특정요소 탐색 : O(n)
- n번째 요소 참조 : O(n)

### vector의 시간복잡도

- n번째 인덱스에 삽입, 삭제 : O(n)
- 마지막 요소에 삽입, 삭제 : O(1)
- 특정요소 탐색 : O(n)
- n번째 요소 참조 : O(1)

> 인접리스트에서 많이 사용되는 연산은 (1)마지막요소 삽입과 (2)탐색 연산이라 vector로 구현해도 됨

### 인접리스트의 탐색방법

```cpp
// DFS (깊이 우선 탐색)
void dfs(int node, vector<int> adj[], bool visited[]) {
visited[node] = true;
for(int next : adj[node]) {
if(!visited[next]) {
dfs(next, adj, visited);
}
}
}

// BFS (너비 우선 탐색)
void bfs(int start, vector<int> adj[]) {
queue<int> q;
bool visited[MAX] = {false};

q.push(start);
visited[start] = true;

while(!q.empty()) {
int node = q.front();
q.pop();

for(int next : adj[node]) {
if(!visited[next]) {
visited[next] = true;
q.push(next);
}
}
}
}
```

## 인접행렬 vs 인접리스트

### 공간복잡도

| | | |
| -------------- | ------ | --------------------- |
| **인접행렬** | O(V²) | V×V 크기의 2차원 배열 |
| **인접리스트** | O(V+E) | 정점 수 + 간선 수만큼 |

### 시간복잡도

| | | |
| --------------------------------- | ----- | --------- |
| **두 정점의 연결 확인** | O(1) | O(degree) |
| **한 정점의 모든 인접 정점 찾기** | O(V) | O(degree) |
| **간선 추가** | O(1) | O(1) |
| **간선 삭제** | O(1) | O(degree) |
| **전체 그래프 순회** | O(V²) | O(V+E) |

### 인접행렬을 사용하는 경우

- 정점 수가 적을 때 (V ≤ 1000 정도) ⇒ 그래프가 희소(sparse) 할 때
- 간선 유무를 자주 확인해야 할 때
- 밀집 그래프(dense graph)일 때
- 플로이드-워셜 같은 알고리즘

### 인접리스트를 사용하는 경우(더 일반적으로 사용함)

- 정점 수가 많을 때 ⇒ 그래프가 조밀(dense) 할 때
- 희소 그래프일 때
- DFS, BFS, 다익스트라 등 대부분의 그래프 알고리즘
- **코딩 테스트에서 대부분의 경우**

---

### 희소/밀집 그래프?

**희소 그래프 (Sparse Graph)**

- 정점(노드)의 수에 비해 간선이 상대적으로 적은 그래프
- 간선 수가 최대 가능한 간선 수보다 훨씬 적은 경우
- 수학적으로는 보통 E ≪ V² (E는 간선 수, V는 정점 수)
- 예:
- 정점이 1,000개인데 간선이 2,000개 정도인 경우 → 희소 그래프
- 특징:
- 메모리를 절약하려면 인접 리스트가 유리함
- 인접 행렬로 표현하면 대부분의 셀이 0(즉, 연결 안 된 상태)이라 공간 낭비가 큼
- 예시: 소셜 네트워크에서 일반 유저 간 친구 관계 (모두가 서로 친구는 아님)

**밀집 그래프 (Dense Graph)**

- 정점의 수에 비해 간선이 많은 그래프
- 간선 수가 거의 최대치에 가까운 경우
- 보통 E ≈ V² 수준
- 예:
- 정점이 100개인데 간선이 4,000개 이상이면 (100² = 10,000 중 절반 이상 연결) 밀집 그래프라고 봄
- 특징:
- 인접 행렬이 탐색에 유리 (모든 노드 간 연결 여부를 빠르게 확인 가능)
- 인접 리스트는 저장공간이 커지고 탐색 시 모든 리스트를 순회해야 해서 비효율적
- 예시: 완전 그래프(모든 정점이 서로 연결된 그래프)

---

### 컬렉션?

Array, Map, Set 같은 건 “자료구조를 기반으로 한 컬렉션 객체”

| 구분 | 설명 |
| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **자료구조 (Data Structure)** | 데이터를 저장하고 관리하기 위한 **구조적 개념**<br/>_e.g. 배열(Array), 연결 리스트(Linked List), 스택(Stack), 큐(Queue), 트리(Tree), 그래프(Graph) 등_ |
| **컬렉션 (Collection)** | 여러 데이터를 모아 관리하는 **구현체나 컨테이너** 개념. 주로 고급 언어나 런타임에서 제공하는 **구체적인 자료구조 구현체**를 말함.<br>_e.g. JavaScript의 `Array`, `Map`, `Set` 같은 것들_ |
64 changes: 64 additions & 0 deletions data-structure/승헌/AdjacencyMatrix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
## 인접행렬(adjacency matrix)

그래프를 표현하는 대표적인 방법 중 하나.

그래프의 연결 관계를 2차원 배열(행렬)로 나타냄.

### 기본 개념

정점이 n개인 그래프가 있을 때, $n*n$의 행렬로 표현

행렬의 `(i, j)` 위치 값은 정점 `i`에서 정점 `j`로 가는 간선의 존재 여부나, 가중치를 나타냄

### 표현 방식

**무방향 그래프(Undirected Graph)**

- 간선이 있으면 1, 없으면 0
- 대칭 행렬 형태 (`matrix[i][j] = matrix[j][i]`)

**방향 그래프(Directed Graph)**

- i → j 간선이 있으면 `matrix[i][j] = 1`
- 비대칭 행렬일 수 있음

**가중치 그래프(Weighted Graph)**

- 간선의 가중치 값을 저장
- 간선이 없으면 0 또는 ∞(무한대)

### 예시

정점 A, B, C, D가 있고 A-B, A-C, B-D 간선이 있다면:

```tsx
// 표로 나타내면
A B C D
A [ 0 1 1 0 ]
B [ 1 0 0 1 ]
C [ 1 0 0 0 ]
D [ 0 1 0 0 ]

// 코드로 표현하면
bool a[4][4] = {
{0, 1, 1, 0},
{1, 0, 0, 1},
{1, 0, 0, 0},
{0, 1, 0, 0},
};
```

- `(1, 1)`, `(2, 2)`와 같은 자기 자신을 나타내는 위치(대각선 원소)는,
정점의 사이클이 있는 경우 1로 표기하고, 사이클이 없는 경우(트리) 0으로 표기함

### **장점**

- 두 정점 간 연결 여부를 O(1)에 확인 가능
- 구현이 간단하고 직관적
- 간선 추가/삭제가 $O(1)$

### **단점**

- 공간 복잡도가 $O(n²)$로 비효율적
- 정점이 많고 간선이 적은 희소 그래프에서 메모리 낭비
- 모든 간선을 확인하려면 $O(n²)$ 시간 필요
34 changes: 34 additions & 0 deletions data-structure/승헌/Graph.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
## 그래프이론의 기초

### 그래프의 종류

| | |
| --------------------------------- | ----------------------------------------- |
| **무방향 그래프** | 간선에 방향 없음. A—B는 B—A와 동일 |
| **방향 그래프** | 간선에 방향 존재. A→B와 B→A는 다름 |
| **가중치 그래프(Weighted Graph)** | 간선마다 비용(weight)이 존재 |
| **비가중치 그래프** | 모든 간선의 비용이 동일하거나 중요치 않음 |

### 정점(Vertex)

그래프의 구성 요소(노드)

- 분할할 수 없는 객체
- “점”으로 표현되는 위치, 사람, 물건 등

### 간선(Edge)

- 정점 간의 연결 관계
- 정점을 잇는 선, 관계, 경로 등

### indegree outdegree

- 정점으로 나가는 간선을 outdegree
- 들어오는 간선을 indegree
- 간선의 개수에 따라 수치(차수)로 표현하기도 함

### 가중치(Weight)

- 정점과 정점 사이에 드는 비용을 말함
- 거리/비용/시간 등 “연결의 강도”를 나타냄
- 최단 경로 알고리즘에서 핵심 개념
115 changes: 115 additions & 0 deletions data-structure/승헌/HashTable.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
# 해시테이블

‘키(key)’와 ‘값(value)’의 쌍으로 데이터를 저장하는 자료구조

검색, 삽입, 삭제 같은 연산을 평균적으로 O(1)시간에 처리가 가능함

- 키(key): 데이터 식별을 위한 고유한 값
- 값(value): 실제로 저장되는 데이터

*e.g.*

- ***자바스크립트:** Map, Object*
- ***파이썬:** dict*
- ***자바:** HashMap, Hashtable*

## 해시, 해싱, 해싱함수

### 해시

- 다양한 길이를 가진 데이터를 고정된 길이를 가진 데이터로 매핑한 값

### 해싱

- 임의의 데이터를 해시로 바꾸는 작업

### 해시함수

- 임의의 데이터를 입력으로 받아 **일정한 길이의 데이터(인덱스)**로 바꿔주는 함수

---

## 시간복잡도

해시테이블읜 최악과 평균의 차이가 커서, 이를 고려해 사용 여부를 결정하는게 좋음

### 평균시간복잡도

- 참조 : $O(1)$
- 탐색 : $O(1)$
- 삽입 / 삭제 : $O(1)$

### 최악의 시간복잡도

만약 해시테이블에서 충돌이 많이 일어난다면 해당 해시값이 같은 모든 요소들을 탐색해야
하므로 $O(n)$의 시간복잡도가 소요됨

- 참조 : $O(n)$
- 탐색 : $O(n)$
- 삽입 / 삭제 : $O(n)$

---

## 충돌 문제 해결방법

해시 함수가 서로 다른 키를 같은 인덱스로 매핑할 수 있는데, 이걸 **충돌**이라고 함

### 1. 체이닝(Chaining)

충돌시 연결리스트에 할당하고 충돌시 연결리스트를 탐색하는 기법

- 장점: 구현이 간단, 해시테이블에 많은 데이터를 넣을 수 있음
- 단점: 연결리스트기반이라 캐시성능이 좋지 않음 체인이 길어지면 최악의 경우
$O(n)$

```jsx
{
key: "apple",
value: 100,
next: { key: "banana", value: 200, next: null }
}
// 이런식으로 저장함
```


### 2. 개방주소법(Open Addressing)

개방주소법(open addressing)은 충돌시 다른 버켓에 데이터를 삽입하는 기법

1. 선형 탐색(Linear Probing)
- 해시충돌 시 다음 버켓, 혹은 몇 개를 "선형적으로” 건너뛰어 데이터를 삽입
ex) 1, 2, 3, 4
2. 제곱 탐색(Quadratic Probing)
- 해시충돌 시 1부터 연속적인 수를 만들며 해당 수의 제곱만큼 건너뛴 버켓에 데이터를
삽입
ex) 1,4,9,16...
3. 이중 해싱(Double Hashing)
- 해시충돌 시 다른 해시함수를 한 번 더 적용한 결과를 이용해서 데이터를 삽입

### 무한 순환이 발생하면?

1. 테이블이 꽉찬경우
1. 에러 리턴
2. 테이블 크기 리사이징
2. 해시함수가 하자라서 순환하는 경우
1. 테이블 크기는 소수로 잡기

```jsx
// e.g. 제곱탐사
index = (h(key) + i²) % tableSize
tableSize = 8
h(key) = 0

>> 0, 1, 4, 1, 0, 1, 4, 1, ... 한무 반복
```

2. 다른 탐사 방식으로 전환

## 장단점

| **구분** | **장점** | **단점** |
| --- | --- | --- |
| 해시테이블 | 평균적으로 빠른 검색/삽입/삭제 (O(1)) | 해시 충돌 시 성능 저하, 해시 함수 설계 중요 |
| 배열 대비 | 인덱스 대신 키로 접근 가능 | 순서가 유지되지 않음 |

---
Loading