Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/wnsdk/algorithm-for-coding-test
๐ง ์ฝ๋ฉํ
์คํธ๋ฅผ ์ํ ์๊ณ ๋ฆฌ์ฆ ์ด๋ก ์ ๋ฆฌ
https://github.com/wnsdk/algorithm-for-coding-test
Last synced: 11 days ago
JSON representation
๐ง ์ฝ๋ฉํ ์คํธ๋ฅผ ์ํ ์๊ณ ๋ฆฌ์ฆ ์ด๋ก ์ ๋ฆฌ
- Host: GitHub
- URL: https://github.com/wnsdk/algorithm-for-coding-test
- Owner: wnsdk
- Created: 2022-10-14T03:30:45.000Z (about 2 years ago)
- Default Branch: master
- Last Pushed: 2024-09-15T09:47:53.000Z (4 months ago)
- Last Synced: 2024-11-05T15:08:48.562Z (about 2 months ago)
- Language: Java
- Homepage:
- Size: 132 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# ๐ง ์ฝ๋ฉํ ์คํธ๋ฅผ ์ํ ์๊ณ ๋ฆฌ์ฆ ์ ํ ์ ๋ฆฌ
์์ ์ฝ๋๋ ๋ชจ๋ ํ์ด์ฌ์ผ๋ก ์์ฑ๋์๋ค.
ํ์ด์ฌ ๋ฌธ๋ฒ์ [์ฌ๊ธฐ](./sub/Python.md)์์ ํ์ธ.
์๋ ๋ชฉ์ฐจ์์ ๋ค๋ฃจ์ง ์์ ๊ธฐํ ์์ํ ์๊ณ ๋ฆฌ์ฆ์ [์ฌ๊ธฐ](./sub/etc.md)์์ ํ์ธ.### ๋ชฉ์ฐจ
- [์๋ฃ๊ตฌ์กฐ](#์๋ฃ๊ตฌ์กฐ)
- [์์ ํ์](#์์ -ํ์)
- [์ด๋ถ ํ์](#์ด๋ถ-ํ์)
- [๋์ ๊ณํ๋ฒ](#๋์ -๊ณํ๋ฒ)
- [ํ์๋ฒ](#ํ์๋ฒ)
- [์์](#์์)
- [์ฝ์์ ๋ฐฐ์](#์ฝ์์-๋ฐฐ์)
- [์์์ ๋ ฌ](#์์์ ๋ ฌ)
- [๊ฐ์ค์น๊ฐ ์๋ ์ต๋จ๊ฑฐ๋ฆฌ](#๊ฐ์ค์น๊ฐ-์๋-์ต๋จ๊ฑฐ๋ฆฌ)
- ๋์ ํฉ (์์ )
- ๋ถํ ์ ๋ณต (์์ )
- ์ต์ ์ ์ฅ ํธ๋ฆฌ (์์ )
- ์ปจ๋ฒก์ค ํ (์์ )
- ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ (์์ )
- ๋ฌธ์์ด ์๊ณ ๋ฆฌ์ฆ (์์ )
# ์๋ฃ๊ตฌ์กฐ
์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํ ๋ ํ์ํ ๋ฐ์ดํฐ๋ค์ ์ด๋ค ์๋ฃ๊ตฌ์กฐ์ ๋ด์ ๊ฒ์ธ์ง๋ฅผ ๊ณ ๋ฏผํด์ผํ๋ค.
## ๋ฐฐ์ด / ์คํ
โ list
```python
list = []list.append(x)
list.pop()
```- ๋ฐฐ์ด Array
- ์คํ Stack : ํ ์ชฝ ๋์์๋ง ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ๋บ ์ ์๋ ์ ํ ์๋ฃ๊ตฌ์กฐ (FILO ๋๋ LIFO)## ํ / ๋ฑ
โ deque
```python
from collections import dequedq = deque()
dq.append(x)
dq.pop()dq.appendleft(x)
dq.popleft()
```- ํ Queue : ํ ์ชฝ์์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ ์๋ง ์๊ณ , ๋ค๋ฅธ ํ ์ชฝ์ ๋ฐ์ดํฐ๋ฅผ ๋บ ์๋ง ์๋ ์ ํ ์๋ฃ๊ตฌ์กฐ (FIFO ๋๋ LILO)
- ๋ฑ Deque : ์ ์ชฝ ๋ชจ๋์์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ๋บ ์ ์๋ ์ ํ ์๋ฃ๊ตฌ์กฐ## ์ฐ์ ์์ ํ
โ heap
```python
import heapqh = []
heapq.heappush(h, x)
heapq.heappop(h)
```- ์ฐ์ ์์ ํ Priority Queue : ์ฐ์ ์์ ํ๋ ๋ด๋ถ์ ์ผ๋ก ํ(heap)์ด๋ผ๋ ์์ ์ด์งํธ๋ฆฌ๋ก ๊ตฌ์ฑ๋์ด์๋ค. ํ์ด์ฌ์ ๊ฒฝ์ฐ ํ์ ๋ฃจํธ ๋ ธ๋์๋ โ์ธ์ ๋โ ์ต์๊ฐ์ด ๋ค์ด์๋ค. (์ต์ํ)
## ๋งต
โ dict
```python
```
## ์งํฉ
โ set
## ๊ทธ๋ํ
โ ์ธ์ ํ๋ ฌ / ์ธ์ ๋ฆฌ์คํธ
**๊ตฌ์ฑ**
- ์ ์ (Vertex ๋๋ Node)
- ๊ฐ์ (Edge)**๊ทธ๋ํ์ ์ฐ๊ฒฐ ์์ Connected Component**
- ์๋ก ์์ ํ ๋ถ๋ฆฌ๋ ์์๋ค์ '์ฐ๊ฒฐ ์์'๋ผ๊ณ ํฉ๋๋ค.
- ์ ๊ทธ๋ฆผ์ ๊ฐ๊ฐ์ ๊ทธ๋ํ 2๊ฐ๊ฐ ์๋, ์ฐ๊ฒฐ ์์ 2๊ฐ๋ก ์ด๋ค์ง ๊ทธ๋ํ 1๊ฐ ์ ๋๋ค.### **[๊ทธ๋ํ์ ๋ถ๋ฅ](https://beluga9.tistory.com/369#%EA%B-%B-%EB%-E%--%ED%--%--%EC%-D%--%--%EB%B-%--%EB%A-%--)**
**1. ๊ทธ๋ํ์ ๋ฐฉํฅ์ฑ**
![https://blog.kakaocdn.net/dn/bsyTRB/btrAcQbq66m/2DOJGKE0xA2pgbz9k5lWD0/img.png](https://blog.kakaocdn.net/dn/bsyTRB/btrAcQbq66m/2DOJGKE0xA2pgbz9k5lWD0/img.png)
| ๋ฐฉํฅ ๊ทธ๋ํ | ๋ฐฉํฅ์ด ์ ํด์ ธ ์์ |
| --- | --- |
| ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ | ์ด๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ ์๊ด ์์ (์๋ฐฉํฅ ๊ทธ๋ํ) |**2. ๊ทธ๋ํ์ ์ํ์ฑ**
![https://blog.kakaocdn.net/dn/bamCjZ/btrAcuGq9dD/zTlfXjZ1QwdFB90QpiIvcK/img.png](https://blog.kakaocdn.net/dn/bamCjZ/btrAcuGq9dD/zTlfXjZ1QwdFB90QpiIvcK/img.png)
| ์ํ ๊ทธ๋ํ | ์ํํ๋ ๋ถ๋ถ์ด ํ ๊ตฐ๋ฐ๋ง ์์ด๋ ์ํ ๊ทธ๋ํ |
| --- | --- |
| ๋น์ํ ๊ทธ๋ํ | ์ํํ๋ ๋ถ๋ถ์ด ์ ํ ์์ |๋ฌด์์ ๊ตฌํ๋ ๋ฌธ์ ์ธ๊ฐ?
1. ์ฐ๊ฒฐ ์์ ๊ฐ์ ๊ตฌํ๊ธฐ
for๋ฌธ์ผ๋ก ๋ชจ๋ ๋ ธ๋๋ฅผ ๋๋ฉด์, ๋ฐฉ๋ฌธํ ์ ์๋ ๋ ธ๋๋ผ๋ฉด bfs์ ์์ ๋ ธ๋๋ก ๋์ ํ๋ค.
bfs ํจ์๊ฐ ๋ฐ๋๋ ํ์๊ฐ ์ฐ๊ฒฐ ์์์ ๊ฐ์์ด๋ค.
2. ์ต๋จ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ
bfs์ ํ์ ํ์ฌ ์ขํ๋ฅผ appendํ ๋, ํ์ฌ ์ขํ๊น์ง ์ค๋๋ฐ ๊ฑธ๋ ธ๋ ๊ฑฐ๋ฆฌ d๊ฐ์ ๊ฐ์ด appendํ๋ค.
๋ชฉ์ ์ง์ ๋๋ฌํ์ ๋์ d๋ ์ต๋จ๊ฑฐ๋ฆฌ์์ด ๋ณด์ฅ๋๋ค.
3. ๊ฒฝ๋ก ๊ตฌํ๊ธฐ
chk ๋ฆฌ์คํธ๋ ๋ณดํต, ๊ฐ ๋ ธ๋๋ณ๋ก True/False ๊ฐ๋ง ๋ด๊ธฐ๊ฒ๋ ๊ตฌ์ฑํ์ง๋ง,
๊ฐ ๋ ธ๋๋ณ๋ก "์ด ๋ ธ๋์ ์ฌ ๋๊น์ง ๊ฑธ๋ฆฐ ๊ฒฝ๋ก๋ค(์๋ฃํ์ ์งํฉ)"์ ๋ด์ ์๋ ์๋ค.
๊ฒฝ๋ก๋ง ๊ตฌํด์ผ๋๋ ๋ฌธ์ ์ผ ์๋ ์๊ณ ,
๊ฐ๋ฅํ ๋ชจ๋ ๊ฒฝ๋ก์ ์๋ฅผ ๊ตฌํด์ผ๋๋ ๋ฌธ์ ์ผ ์๋ ์๊ณ ,
์ธ์ธํ ๊ฒฝ๋ก๋ค์ ๋งค์๊ฐ ํ์ ํ๊ณ ์์ด์ผ ํ๋ฆฌ๋ ๋ฌธ์ ๋ ์์ ์ ์๋ค.
๋ชฉ์ ์ง๊ฐ ์ ํด์ ธ์๋๊ฐ?
1. ๋ชฉ์ ์ง๊ฐ ์ ํด์ ธ ์๋ค.
๋จ์ํ ํ์ ๋ ธ๋๊ฐ ๋ชฉ์ ๋ ธ๋์ ์ผ์นํ๋์ง๋ง ๋ฐ์ ธ์ ํ์์ ์ข ๋ฃํ๋ค.
2. ๋ชฉ์ ์ง๊ฐ ์ ํด์ ธ ์์ง ์๋ค.
๋ชฉ์ ์ง๊ฐ ๋ช ์๋์ด ์์ง ์๋๋ผ๋, ๋ถ๋ช ํ์ ์ข ๋ฃ ์กฐ๊ฑด์ด ์์ ๊ฒ์ด๋ค.
ํ์ ์ข ๋ฃ ์กฐ๊ฑด์ ๋ฐ๋ก ํ์ ํด์ค์ผ ํ๋ค.
์๋ฃ๊ตฌ์กฐ์ธ ๊ทธ๋ํ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ
1. ๋ ธ๋๊ฐ์ ์ฐ๊ฒฐ ์ ๋ณด๋ง ์ฃผ์ด์ก์ ๋
์ธ์ ํ๋ ฌ(adj)๋ก ๊ตฌํํ๋ค.
2. ๊ฒฉ์ํ์ด ์ฃผ์ด์ก์ ๋
๊ฒฉ์ํ(board) ๊ทธ๋๋ก ์ ์ฅํ๋ค.
์ด๋์ dy, dx๋ฅผ ์ด์ฉํ๋ค.
# ์์ ํ์
- ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋ค ์ดํด๋ณธ๋ค!
- ๊ฑฐ์ ๊ฐ์ ์๋ฏธ์ธ '๋ธ๋ฃจํธ ํฌ์ค(๋ฌด์ฐจ๋ณ ๋์ )'๋ผ๋ ์ฉ์ด๋ก๋ ๋ถ๋ฆฐ๋ค.
- ์์ ํ์์ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด๊ธฐ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฝ๋๋ค. ์๊ฐ์ ๋จ์ถ์ํค๊ณ ์ถ๋ค๋ฉดย **๋ฐฑํธ๋ํน**์ ์ฌ์ฉํ๋ค.ย ๋ฐฑํธ๋ํน์ด๋ ํ์ ๊ณผ์ ์์ ๋ ์ด์ ๋ต์ด ๋์ง ์๋ ๋ถ๊ธฐ๋ฅผ ๋ฐ๊ฒฌํ์ ๋ ๋๋์๊ฐ๋ ๊ธฐ๋ฒ์ ์๋ฏธํ๋ค.
- ์์ ํ์์ ํฌ๊ฒ ๋ฐ๋ณต๋ฌธ / ์ฌ๊ท / ํ๋ก ๊ตฌํํ ์ ์๋ค.
- ์ฌ๊ท(dfs)๋ก ํ์๋๋ฐ ์๊ฐ / ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๋๋ฉด ๋ฐ๋ณต๋ฌธ์ผ๋ก ํ์ด๋ณด๊ธฐ- ์กฐํฉ์ ๊ฐ์ง์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ ํ์ค์นผ์ ์ผ๊ฐํ ๊ณต์์ ์ด์ฉํ์ฌ dp๋ก ํ ์๋ ์๋ค.
| | |
| --- | --- |
| ์์ด | dfs, ๋ฐฑํธ๋ํน์ผ๋ก ๊ตฌํ |
| ์ค๋ณต์์ด | ์์ด๊ณผ ๋๊ฐ์ด ๊ตฌํํ๋, ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํ์ง ์์ |
| ์กฐํฉ | ์์ด๊ณผ ๋๊ฐ์ด ๊ตฌํํ๋, ์ธ๋ฑ์ค๊ฐ ์ค๋ฆ์ฐจ์์ ๋ง์กฑํ๊ณ , ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํ์ง ์์ |
| ์ค๋ณต์กฐํฉ | ์์ด๊ณผ ๋๊ฐ์ด ๊ตฌํํ๋, ์ธ๋ฑ์ค๊ฐ ๋น๋ด๋ฆผ์ฐจ์์ ๋ง์กฑํ๊ณ , ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํ์ง ์์ |## ์์ด
n๊ฐ์ ์ ์ค r๊ฐ๋ฅผ ๋ฝ์ ์ค์ ์ธ์ฐ๋ ๋ฐฉ๋ฒ์ ์
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
```python
from itertools import permutations
arr = [0, 1, 2, 3]
for i in permutations(arr, 4):
print(i)
```
- ์ง์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ
```python
chk = [False] * (N + 1)
ans = []
def permutation(n, m):
if m == 0:
print(*ans)
else:
for i in range(1, n + 1):
if not chk[i]:
chk[i] = True
ans.append(i)
permutation(n, m - 1)
ans.pop()
chk[i] = False
permutation(N, M)
```
## ์ค๋ณต ์์ด
n๊ฐ์ ์ ์ค ์ค๋ณต์ ํ์ฉํ์ฌ r๊ฐ๋ฅผ ๋ฝ์ ์ค์ ์ธ์ฐ๋ ๋ฐฉ๋ฒ์ ์
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
```python
from itertools import product
arr = [0, 1, 2 ,3]
for i in product(arr, repeat = 2):
print(i)
```
- ์ง์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ
```python
ans = []
def permutation(n, m):
if not m:
print(*ans)
else:
for i in range(1, n + 1):
ans.append(i)
permutation(n, m - 1)
ans.pop()
permutation(N, M)
```
## ์กฐํฉ
n๊ฐ์ ์ ์ค r๊ฐ๋ฅผ ๋ฝ๋ ๋ฐฉ๋ฒ์ ์
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
```python
from itertools import combinations
arr = [0, 1, 2, 3]
for i in combinations(arr, 2):
print(i)
```
- ์ง์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ
```python
ans = []
def combination(n, m, idx):
if not m:
print(*ans)
else:
for i in range(idx, n):
ans.append(i)
combination(n, m - 1, i + 1)
ans.pop()
combination(N, M, 0)
```
## ์ค๋ณต ์กฐํฉ
n๊ฐ์ ์ ์ค ์ค๋ณต์ ํ์ฉํ์ฌ r๊ฐ๋ฅผ ๋ฝ๋ ๋ฐฉ๋ฒ์ ์
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
```python
from itertools import combinations_with_replacement
arr = [0, 1, 2, 3]
for i in combinations_with_replacement(arr, 2):
print(i)
```
- ์ง์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ
```python
ans = []
def combination(n, m, idx):
if not m:
print(*ans)
else:
for i in range(idx, n + 1):
ans.append(i)
permutation(n, m - 1, i)
ans.pop()
combination(N, M, 1)
```
## DFS
๊น์ด์ฐ์ ํ์
์ฌ๊ท
## BFS
๋๋น์ฐ์ ํ์
ํ
```python
# ๊ธธ์ฐพ๊ธฐ ๋ฌธ์
from collections import dequedy = (0, 1, 0, -1)
dx = (-1, 0, 1, 0)
chk = [[False] * X for _ in range(Y)]def is_valid_coord(y, x):
return 0 <= y < Y and 0 <= x < Xdef dfs(y, x):
if adj[y][x] == ans:
return
for k in range(4):
ny = y + dy[k]
nx = x + dx[k]
if is_valid_coord(ny, nx) and not chk[ny][nx]:
chk[ny][nx] = True
dfs(ny, nx)def bfs(sy, sx):
q = deque()
chk[sy][sx] = True
q.append((sy, sx))
while q:
y, x = q.popleft()
if adj[y][x] == ans:
return
for k in range(4):
ny = y + dy[k]
nx = x + dx[k]
if is_valid_coord(ny, nx) and not chk[ny][nx]:
chk[ny][nx] = True
q.append((ny, nx))
```
# ์ด๋ถ ํ์
## ์ ํ ํ์
์์์๋ถํฐ ์ฐจ๋ก๋๋ก ์ฐพ๋ ๊ฒ
## ์ด๋ถ ํ์
ํ์ ๋ฒ์๋ฅผ ์ ๋ฐ์ผ๋ก ์ค์ฌ๊ฐ๋ฉด์ ์ฐพ๋ ๊ฒ
๋ฐฐ์ด ์์ ๊ฐ๋ค์ด ๋ฐ๋์ ์ ๋ ฌ๋์ด ์์ด์ผ ํ๋ค.
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
```python
from bisect import bisect_left, bisect_rightl = bisect_left(arr, key) #key๊ฐ ์ด์์ธ ๊ฐ์ ์ฒ์ ๋ฑ์ฅ ์์น
r = bisect_right(arr, key) #key๊ฐ ์ด๊ณผ์ธ ๊ฐ์ ์ฒ์ ๋ฑ์ฅ ์์นr - l #๋ฐฐ์ด์ ๋ค์ด์๋ key๊ฐ์ ๊ฐ์ (๋ฆฌ์คํธ์ count ํจ์๋ณด๋ค ๋น ๋ฅด๋ค)
```
**bisect_left()**ย : ๋ชฉํ ๊ฐ๋ณด๋ค ๊ฐ๊ฑฐ๋ ํฐ ์ฒซ ๋ฒ์งธ ๊ฐ์ ์์น ๋ฐํ
**bisect_right()**ย : ๋ชฉํ ๊ฐ๋๊ฐ ํฐ ์ฒซ ๋ฒ์งธ ๊ฐ์ ์์น ๋ฐํ
**bisect_right() - bisect_left()**ย : ๋ชฉํ ๊ฐ์ด ๋ช ๊ฐ ์๋์ง ์ ์ ์์
- ์ง์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ
```python
l = 0
r = len(arr) - 1
m = (l + r) // 2while l <= r:
if arr[m] == key:
break
elif arr[m] > key:
r = m - 1
else:
l = m + 1
m = (l + r) // 2
```
## ๋งค๊ฐ๋ณ์ ํ์
Parametric Search
์ต์ ํ ๋ฌธ์ ๋ฅผ ๊ฒฐ์ ๋ฌธ์ ๋ก ๋ฐ๊ฟ ํธ๋ ํ์ ์๊ณ ๋ฆฌ์ฆ
| ์ต์ ํ ๋ฌธ์ Optimization Problem | ๊ฒฐ์ ๋ฌธ์ Decision Problem |
| --- | --- |
| ์ํฉ์ ๋ง์กฑํ๋ ๋ณ์์ ์ต์๊ฐ, ์ต๋๊ฐ์ ๊ตฌํ๋ ๋ฌธ์ | Yes, No ์ค ํ๋๋ก ๋ตํ ์ ์๋ ๋ฌธ์ |
- ์ด๋ถ ํ์ ๋ฐฉ์์ผ๋ก ์ด๋ค ๋ ๊ทธ๋ฃน์ ๊ฒฝ๊ณ์ ์ ์ฐพ์๋ ๋๋ค.
- ์ต์ข ์ ์ผ๋ก ๊ฒฝ๊ณ์ ์ ์ผ์ชฝ ๋ฒ์๋ฅผ ํํ ์ง, ์ค๋ฅธ์ชฝ ๋ฒ์๋ฅผ ํํ ์ง ์ฌ๋ถ๋ฅผ Yes/No ๊ฒฐ์ ๋ฌธ์ ์ ๊ฒฐ๊ณผ๋ก ์ ํฉ๋๋ค.
- ํ๋ผ๋ฉํธ๋ฆญ ์์น์ ๋์ ๋ฐฉ์์ ์ฌ์ค์ ์ด๋ถํ์๊ณผ ๋ค๋ฅผ ๋ฐ ์์ต๋๋ค.
- Binary Search์ย Parametric Search์ ์ฐจ์ด์ ์,ย Binary Search์์๋ ๋ฐฐ์ด์์ X์ ์ผ์นํ๋ ๊ฐ์ ์ฐพ์ผ๋ฉด ๋ฐ๋ก ํจ์๋ฅผ ์ข ๋ฃํ๊ณ ์์น๋ฅผ ๋ฐํํ์ง๋ง,ย Parametric Search๋ ํจ์๋ฅผ ์ข ๋ฃํ์ง ์๊ณ ๋ ์ด์ ์ดํด๋ณผ ๋ฐฐ์ด์ด ๋จ์์์ง ์์๋๊น์ง ํ์์ ๊ณ์ํฉ๋๋ค.
- ํ๋ผ๋ฉํธ๋ฆญ ์์น ๊ด๋ จ ๋ฌธ์ **[https://beluga9.tistory.com/375](https://beluga9.tistory.com/375)**
# ๋์ ๊ณํ๋ฒ
Dynamic Programming(DP)
๋ฌธ์ ๋ฅผ ์ชผ๊ฐ๊ณ , ๋ถ๋ถ ๋ฌธ์ ๋ค์ ๋ต์ ๊ตฌํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉฐ ํธ๋ ๋ฐฉ์
๋์ถฉ n๋ฒ์งธ ๊ฐ์ ๊ตฌํ๊ณ ์ถ์๋ฐ n๋ฒ์งธ ๊ฐ์ด ์์์ ๊ตฌํด๋จ๋ ๊ฐ๋ค(0~n-1๋ฒ์งธ ๊ฐ๋ค)์ ํ์ฉํด์ ๊ตฌํ๋ ๋ฌธ์ ๋ค์ dp๋ผ๊ณ ํจ
์ ํ์์ ์ธ์ฐ๋ ๋ฌธ์ ๋ค์ด dp๋ฌธ์
๋ฉ๋ชจ์ด์ ์ด์ Memoization
- ํ ๋ฒ ๊ตฌํ ๋ถ๋ถ ๋ฌธ์ ์ ๋ต์ ๋ฐ๋ก ์ ์ฅํด๋๊ณ ํ์ํ ๋ ๊บผ๋ด์ฐ๋ ๊ธฐ๋ฒ์ ๋๋ค.
- ์บ์ฑ(caching)์ด๋ผ๊ณ ๋ ํฉ๋๋ค.
- ๋ฉ๋ชจ์ด์ ์ด์ ์ DP์๋ ๋ณ๊ฐ์ ๊ฐ๋ ์ด๊ธด ํ๋, DP ๋ฌธ์ ๋ฅผ ํ ๋ ์๊ฐ์ด๊ณผ๊ฐ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ์๊ฐ ๋จ์ถ์ ์ํด ๊ฐ์ด ์์ฃผ ์ฐ์ด๋ ๊ฐ๋ ์ ๋๋ค.## ์ ๊ทผ ๋ฐฉ์
### Top-down
- ์ฌ๊ท ์ฌ์ฉ
- ํํฅ์ ์ ๊ทผ(Top-down) ๋ฐฉ์์ ๋๋ค.
- ํฐ ๋ฌธ์ ์์ ์์ํ์ฌ ์ ์ ์์ ๋ถ๋ถ ๋ฌธ์ ์ ๋ต์ ๊ตฌํ๊ธฐ ์ํด ๋ด๋ ค๊ฐ๋ ๋ฐฉ์์ ๋๋ค.
- ์ด๋ค ๋ถ๋ถ ๋ฌธ์ ์ ๋ต์ด ํ์ํ ๊ฒฝ์ฐ์ ๋ฅ์น๋ฉด ๊ทธ ๋ ๊ตฌํฉ๋๋ค. (Lazy-Evaluation ๋ฐฉ์)### Bottom-up
- ๋ฐ๋ณต๋ฌธ ์ฌ์ฉ
- ์ํฅ์ ์ ๊ทผ(Bottom-up) ๋ฐฉ์์ ๋๋ค.
- ์์ ๋ถ๋ถ ๋ฌธ์ ๋ถํฐ ์์ฐจ์ ์ผ๋ก ์ ์ ํฐ ๋ฌธ์ ๋ฅผ ํ์ด๊ฐ๋ ๋ฐฉ์์ ๋๋ค.
- ๋ชจ๋ ๋ถ๋ถ ๋ฌธ์ ์ ๋ต์ ๊ตฌํด ๋๊ณ ๋ฌธ์ ๋ฅผ ํ๋๋ค. (Eager-Evaluation ๋ฐฉ์)
- ์ด๋ ๊ฒ ํธ๋ ๋ฐฉ์์ ํ๋ทธ๋ ์ด์ (Tabulation)์ด๋ผ๊ณ ๋ ๋ถ๋ฆ ๋๋ค.### Top-down vs Bottom-up
| ๋น๊ต | Top-down | Bottom-up |
| --- | --- | --- |
| ๊ตฌํ | ์ฌ๊ท | ๋ฐ๋ณต๋ฌธ |
| ์ฅ์ | ์ง๊ด์ , ์ฝ๋ ๊ฐ๋ ์ฑ ์ข์ | ์๊ฐ, ๊ณต๊ฐ ํจ์จ์ฑ์ด ์ข์ |
| ๋จ์ | ์ฌ๊ทํจ์ ํธ์ถ์ด ๋ง์ด ๋๋ฆด ์ ์์ | DPํ ์ด๋ธ์ ์ฑ์ ๋๊ฐ๋ ์์ ํ์ ์ด ํ๋ฆ |## ๋ํ ์ ํ
### LIS
Longest Increasing Sequence
๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด
### Knapsack
# ํ์๋ฒ
- ํญ์ ํ์ฌ ์ํ์์ ์ต์ ์ ๊ฒฝ์ฐ๋ง ํ์์ค๋ฝ๊ฒ ๊ณ ๋ฅด๋ ์ ๋ต
- ์์ ํ์๊ณผ ๋ฌ๋ฆฌ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด์ง๋ ์๋๋ค.
- ๊ทธ๋ฆฌ๋ ๋ฌธ์ ๋ค์ ํน๋ณํ ๋ฐฐ๊ฒฝ์ง์์ด ์๋๋ ๋ฌธ์ ์์ ๊ท์น์ฑ์ ์ฐพ์ผ๋ฉด ํ ์ ์๋ ํธ์ด๋ค.
- ๋ค๋ง ๋์ด๋๋ฅผ ์์ฃผ ์ฌ์ด ๋ฌธ์ ๋ถํฐ ๋งค์ฐ ์ด๋ ต๊ฒ๊น์ง, ์ถ์ ์ ๋ง์๋๋ก ๋ง๋ค ์ ์๋ค.
- ๊ทธ๋ฆฌ๋ ๋ฌธ์ ์ ์ง์ง ์ด๋ ค์ด ๋ถ๋ถ์ ๋ฐ๋ก '**์ด ๋ฌธ์ ๊ฐ ๊ทธ๋ฆฌ๋ ๋ฌธ์ ์ธ์ง ํ๋ณํ๋ ๊ฒ**'## ํ๋ ์ ํ ๋ฌธ์
[**[https://www.acmicpc.net/problem/1931](https://www.acmicpc.net/problem/1931)**](https://www.notion.so/https-www-acmicpc-net-problem-1931-b0df1f84c94e4296beea983da8ffedda)
# ์์
# ์ฝ์์ ๋ฐฐ์
์ต๋๊ณต์ฝ์ / ์ต์๊ณต๋ฐฐ์
๊ท์น 1. x์ y์ ์ต๋๊ณต์ฝ์๋ y์ x % y์ ์ต๋๊ณต์ฝ์์ ๊ฐ๋ค. (์ ํด๋ฆฌ๋ ํธ์ ๋ฒ)๊ท์น 2. ๋ ์์ ๊ณฑ(x * y)๋ ๋ ์์ ์ต๋๊ณต์ฝ์์ ์ต์๊ณต๋ฐฐ์์ ๊ณฑ๊ณผ ๊ฐ๋ค.
์ ๋ ๊ท์น์ ์ด์ฉํ์ฌ ์๋์ ๊ฐ์ด ์ต๋๊ณต์ฝ์์ ์ต์๊ณต๋ฐฐ์๋ฅผ ๊ตฌํ๋ ๋ฉ์๋๋ฅผ ์งค ์ ์์ต๋๋ค.
```python
# x > y
def gcd(x, y):
while y > 0:
x, y = y, x % y
return xdef lcm(x, y):
return x * y // gcd(x, y)
```
์๋๋ฉด ๊ฐ๋จํ๊ฒ math ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ importํด์ gcd์ lcm ๋ฉ์๋๋ฅผ ์ธ ์ ์์ต๋๋ค.
(lcm ๋ฉ์๋๋ ํ์ด์ฌ ๋ฒ์ ์ ๋ฐ๋ผ ์ง์ํ์ง ์์ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ, gcd๋ฉ์๋๋ฅผ ์ด์ฉํด์ ์ต์๊ณต๋ฐฐ์๋ฅผ ๊ตฌํ๋ฉด ๋ฉ๋๋ค.)
```python
import mathmath.gcd(a, b)
math.lcm(a, b)
```# ์์์ ๋ ฌ
-> bfs ์ฌ์ฉ
1. ์ง์ ์ฐจ์๊ฐ 0์ธ ๋ ธ๋(์์์ )์ ํ์ ๋ชจ๋ ๋ฃ๋๋ค
2. ํ์์ ์ง์ ์ฐจ์๊ฐ 0์ธ ๋ ธ๋๋ฅผ ๊บผ๋ด์ด ์์ ๊ณผ ์ธ์ ํ ๋ ธ๋์ ๊ฐ์ ์ ์ ๊ฑฐํ๋ค.
3. ๊ฐ์ ์ ๊ฑฐ ํ ์ง์ ์ฐจ์๊ฐ 0์ด ๋ ๋ ธ๋๋ฅผ ํ์ ๋ฃ๋๋ค.
- > ํ๊ฐ ๋น ๋๊น์ง 2-3์์ ์ ๋ฐ๋ณตํ๋ค.
- ๋ชจ๋ ๋ ธ๋๊ฐ ์ฒ๋ฆฌ๋์๋ค๋ฉด ์์์ ๋ ฌ ์์ฑ
- ๋ชจ๋ ๋ ธ๋๊ฐ ์ฒ๋ฆฌ๋์ง ์์๋ค๋ฉด ์ฌ์ดํด ๋ฐ์
# ๊ฐ์ค์น๊ฐ ์๋ ์ต๋จ๊ฑฐ๋ฆฌ
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ : ์ด๋ ํ ์์ ์ ์ ์ ๊ธฐ์ค์ผ๋ก, ๋ชจ๋ ๋ค๋ฅธ ์ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ
ํ๋ก์ด๋์์ ..
MST (ํฌ๋ฃจ์ค์นผ, ํ๋ฆผ)...