์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- http method
- FACTORY
- Factory Method Pattern
- reflection
- di
- OOP
- Python
- udp
- Android Studio
- ์ด๋ ธํ ์ด์
- tcp
- uri
- URN
- ์ฑ์ฉํ์ ํ
- Dialog
- url
- ๊ธฐ์ด100์
- Kotlin
- 2024-08-20
- ํ๋ IT&E
- AndroidStudio
- menutab
- swagger
- fontstyle
- ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ
- ์ฝ๋์
- OpenAPI
- datepicker
- IOC
- 2024-08-21
dingdong coding
[ ์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค with ํ์ด์ฌ ] DFS/BFS ๋ณธ๋ฌธ
[ ์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค with ํ์ด์ฌ ] DFS/BFS
๐ถ ๊ฐ๋ฐ๊ฐ๋ฐ ๐พ 2022. 3. 21. 23:26
๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ DFS/BFS
โฃ ํ์ : ๋ง์ ์์ ๋ฐ์ดํฐ ์ค์์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๊ณผ์
โฃ ์คํ : FILO (First In Last Out) ์ ๊ตฌ = ์ถ๊ตฌ ( Python์ List append, pop )
print(stack [ : : -1]) # ์ต์๋จ ์์๋ถํฐ ์ถ๋ ฅ
print(stack) # ์ตํ๋จ ์์๋ถํฐ ์ถ๋ ฅ
โฃ ํ : FIFO (First In First Out) ์ ๊ตฌ ≠ ์ถ๊ตฌ ( Python์ deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ append, popleft )
from collections import deque
queue = deque()
###
print(queue) # ๋จผ์ ๋ค์ด์จ ์์๋๋ก ์ถ๋ ฅ
queue.reverse()
print(queue) # ๋์ค์ ๋ค์ด์จ ์์๋ถํฐ ์ถ๋ ฅ
โฃ ์ฌ๊ทํจ์ : ์์ง ์์ ์ ๋ค์ ํธ์ถํ๋ ํจ์ (Recursive Function) ๋ฌดํ๋ฃจํ → ์ข ๋ฃ์กฐ๊ฑด ๋ฐ๋์ ๋ช ์ ex) ํฉํ ๋ฆฌ์ผ
# ๋ฐ๋ณต์ ์ผ๋ก ๊ตฌํํ n!
def factorial_iterative(n):
result = 1
# 1๋ถํฐ n๊น์ง์ ์๋ฅผ ์ฐจ๋ก๋๋ก ๊ณฑํ๊ธฐ
for i in range(1, n + 1):
result *= i
return result
# ์ฌ๊ท์ ์ผ๋ก ๊ตฌํํ n!
def factorial_recursive(n):
if n <= 1: #n์ด 1 ์ดํ์ธ ๊ฒฝ์ฐ 1์ ๋ฐํ
return 1
# n != n * (n-1)! ๋ฅผ ๊ทธ๋๋ก ์ฝ๋๋ก ์์ฑํ๊ธฐ
return n*factorial_recursive(n-1)
# ๊ฐ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ตฌํํ n!์ถ๋ ฅ (n=5)
print('๋ฐ๋ณต์ ์ผ๋ก ๊ตฌํ:', factorial_iterative(5))
print('์ฌ๊ท์ ์ผ๋ก ๊ตฌํ:', factorial_recursive(5))
โฃ ๊น์ด ์ฐ์ ํ์ DFS (Depth-Frist Search) : ๊น์ ๋ถ๋ถ์ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ ( ์คํ or ์ฌ๊ท ํจ์ ์ด์ฉ)
# DFS ๋ฉ์๋ ์ ์
def dfs(graph, v, visited):
# ํ์ฌ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
visited[v] = True
print(v, end=' ')
# ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ๋
ธ๋๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ฐฉ๋ฌธ
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
# ๊ฐ ๋
ธ๋๊ฐ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ฅผ ๋ฆฌ์คํธ ์๋ฃํ์ผ๋ก ํํ (2์ฐจ์ ๋ฆฌ์คํธ)
graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
# ๊ฐ ๋
ธ๋๊ฐ ๋ฐฉ๋ฌธ๋ ์ ๋ณด๋ฅผ ๋ฆฌ์คํธ ์๋ฃํ์ผ๋ก ํํ (1์ฐจ์ ๋ฆฌ์คํธ)
visited = [False]*9
# ์ ์๋ DFS ํจ์ ํธ์ถ
dfs(graph, 1, visited)
โฃ ๋๋น ์ฐ์ ํ์ BFS (Breadth-First Search) : ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ ( ํ ์ด์ฉ )
# DFS ๋ฉ์๋ ์ ์
def dfs(graph, v, visited):
# ํ์ฌ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
visited[v] = True
print(v, end=' ')
# ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ๋
ธ๋๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ฐฉ๋ฌธ
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
# ๊ฐ ๋
ธ๋๊ฐ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ฅผ ๋ฆฌ์คํธ ์๋ฃํ์ผ๋ก ํํ (2์ฐจ์ ๋ฆฌ์คํธ)
graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
# ๊ฐ ๋
ธ๋๊ฐ ๋ฐฉ๋ฌธ๋ ์ ๋ณด๋ฅผ ๋ฆฌ์คํธ ์๋ฃํ์ผ๋ก ํํ (1์ฐจ์ ๋ฆฌ์คํธ)
visited = [False]*9
# ์ ์๋ DFS ํจ์ ํธ์ถ
dfs(graph, 1, visited)
1. ์๋ฃ์ ์ผ๋ ค ๋จน๊ธฐ (์ค์ ๋ฌธ์ )
2. ๋ฏธ๋กํ์ถ (์ค์ ๋ฌธ์ )
[ ์ค์ ๋ฌธ์ ] ์๋ฃ์ ์ผ๋ ค ๋จน๊ธฐ
โป ๋ฌธ์
N x M ํฌ๊ธฐ์ ์ผ์ ํ์ด ์๋ค. ๊ตฌ๋ฉ์ด ๋ซ๋ ค ์๋ ๋ถ๋ถ์ 0, ์นธ๋ง์ด๊ฐ ์กด์ฌํ๋ ๋ถ๋ถ์ 1๋ก ํ์๋๋ค. ๊ตฌ๋ฉ์ด ๋ซ๋ ค์๋ ๋ถ๋ถ๋ผ๋ฆฌ ์, ํ, ์ข, ์ฐ๋ก ๋ถ์ด์๋ ๊ฒฝ์ฐ ์๋ก ์ฐ๊ฒฐ๋์ด ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค.
์ด๋ ์ผ์ ํ์ ๋ชจ์์ด ์ฃผ์ด์ก์ ๋ ์์ฑ๋๋ ์ด ์์ด์คํฌ๋ฆผ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๋์ 4 x 5 ์ผ์ ํ ์์์์๋ ์์ด์คํฌ๋ฆผ์ด ์ด 3๊ฐ ์์ฑ๋๋ค.
0 | 0 | 1 | 1 | 0 |
0 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
์ ๋ ฅ์กฐ๊ฑด
- ์ฒซ ๋ฒ์งธ ์ค์ ์ผ์ ํ์ ์ธ๋ก ๊ธธ์ด N๊ณผ ๊ฐ๋ก๊ธธ์ด M์ด ์ฃผ์ด์ง๋ค.
- ๋ ๋ฒ์งธ ์ค๋ถํฐ N+1 ๋ฒ์งธ ์ค๊น์ง ์ผ์ ํ์ ํํ๊ฐ ์ฃผ์ด์ง๋ค.
- ์ด๋ ๊ตฌ๋ฉ์ด ๋ซ๋ ค์๋ ๋ถ๋ถ์ 0, ๊ทธ๋ ์ง ์์ ๋ถ๋ถ์ 1์ด๋ค.
์ถ๋ ฅ์กฐ๊ฑด
- ํ ๋ฒ์ ๋ง๋ค ์ ์๋ ์์ด์คํฌ๋ฆผ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
# ์๋ฃ์ ์ผ๋ ค๋จน๊ธฐ
# ํ์ด ํด์ค
n, m = map(int, input().split())
arr = []
for i in range(n):
arr.append(list(map(int, input())))
def dfs(x, y):
if x <= -1 or x >= n or y <= -1 or y > m:
return False
if arr[x][y] == 0:
arr[x][y] = 1
dfs(x - 1, y)
dfs(x, y - 1)
dfs(x + 1, y)
dfs(x, y + 1)
return True
return False
result = 0
for i in range(n):
for j in range(m):
if dfs(i, j) == True:
result += 1
print(result)
[ ์ค์ ๋ฌธ์ ] ๋ฏธ๋ก ํ์ถ
โป ๋ฌธ์
๋๋น์ด๋ N x M ํฌ๊ธฐ์ ์ง์ฌ๊ฐํ ๋ฏธ๋ก์ ๊ฐํ์๋ค. ๋ฏธ๋ก์๋ ์ฌ๋ฌ ๋ง๋ฆฌ์ ๊ดด๋ฌผ์ด ์์ด ์ด๋ฅผ ํผํด ํ์ถํด์ผํ๋ค. ๋๋น์ด์ ์์น๋ (1, 1)์ด๊ณ ๋ฏธ๋ก์ ์ถ๊ตฌ๋ (N, M)์ ์์น์ ์กด์ฌํ์ฌ ํ ๋ฒ์ ํ ์นธ์ฉ ์ด๋ํ ์ ์๋ค. ์ด ๋ ๊ดด๋ฌผ์ด ์๋ ๋ถ๋ถ์ 0์ผ๋ก, ๊ดด๋ฌผ์ด ์๋ ๋ถ๋ถ์ 1๋ก ํ์๋์ด ์๋ค. ๋ฏธ๋ก๋ ๋ฐ๋์ ํ์ถํ ์ ์๋ ํํ๋ก ์ ์๋๋ค.
์ด ๋ ๋๋น์ด๊ฐ ํ์ถํด์ผํ๋ ์ต์ ์นธ์ ๊ฐ์๋ฅผ ๊ตฌํ์๋ก. ์นธ์ ์ ๋๋ ์์ ์นธ๊ณผ ๋ง์ง๋ง ์นธ์ ๋ชจ๋ ํฌํจํด์ ๊ณ์ฐํ๋ค.
์ ๋ ฅ์กฐ๊ฑด
- ์ฒซ์งธ ์ค์ ๋ ์ ์ N, M์ด ์ฃผ์ด์ง๋๋ค. ๋ค์ N๊ฐ์ ์ค์๋ ๊ฐ๊ฐ M๊ฐ์ ์ ์๋ก ๋ฏธ๋ก์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ๊ฐ์ ์ ๋ค์ ๊ณต๋ฐฑ ์์ด ๋ถ์ด์ ์ ๋ ฅ์ผ๋ก ์ ์๋๋ค. ๋ํ ์์ ์นธ๊ณผ ๋ง์ง๋ง ์นธ์ ํญ์ 1์ด๋ค.
์ถ๋ ฅ์กฐ๊ฑด
- ์ฒซ์งธ ์ค์ ์ต์ ์ด๋ ์นธ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
# ๋ฏธ๋ก ํ์ถ
# ํ์ด ํด์ค
from collections import deque
n, m = map(int, input().split())
arr = []
for i in range(n):
arr.append(list(map(int, input())))
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def bfs(x, y):
queue = deque()
queue.append((x, y))
while queue:
x, y = queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or ny < 0 or nx >= n or ny >= m:
continue
if arr[nx][ny] == 1:
arr[nx][ny] = arr[x][y] + 1
queue.append((nx, ny))
return arr[n - 1][m - 1]
print(bfs(0, 0))
๊ฐ์ ๋ฐ ์ถ์ฒ
'๐ตCoding Test > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ ์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค with ํ์ด์ฌ ] ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ (0) | 2022.04.29 |
---|---|
[ ์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค with ํ์ด์ฌ ] ์ด์ง ํ์ (0) | 2022.03.23 |
[ ์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค with ํ์ด์ฌ ] ์ ๋ ฌ (0) | 2022.03.23 |
[ ์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค with ํ์ด์ฌ ] Implementaion (0) | 2022.02.25 |
[ ์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค with ํ์ด์ฌ ] Greedy (0) | 2022.02.08 |