์ฝํ ์ ํญ์ ๋ฌป์ง๋ ๋ฐ์ง์ง๋ ์๊ณ ๋์ค๋ DFS/BFS ์๊ณ ๋ฆฌ์ฆ์ ํ์ํด๋ณผ ์๊ฐ์ด๋ค.
์ฝํ ๋ง์ถคํ ๊ฐ๋ ์ค๋ช
๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์ค์ํ์ง ์์ง๋ง, ๋ฌด์จ ๋ป์ด๋๋ฉด
๊ทธ๋ํ: ์ฌ๋ฌ ๊ฐ์ฒด๋ค์ด ์ฐ๊ฒฐ๋์ด ์๋ ์๋ฃ ๊ตฌ์กฐ
ํ์: ํน์ ๊ฐ์ฒด๋ฅผ ์ฐพ๊ธฐ ์ํ ์๊ณ ๋ฆฌ์ฆ
์ฆ, ์ฌ๋ฌ ๊ฐ์ฒด๋ค์ด ์ฐ๊ฒฐ๋ ๊ทธ๋ํ์์ ํน์ ๊ฐ์ฒด๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ด์ฌ์๋ค.
๊ทธ๋ผ ์ด๋ค ๋ฌธ์ ๋ฅผ DFS/BFS ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์ด์ผํ๋?
๋ํ์ ๋ฌธ์ ์ ํ์ ์๋์ ๊ฐ๋ค.
1. ๊ฒฝ๋กํ์ ์ ํ(์ต๋จ๊ฑฐ๋ฆฌ, ์๊ฐ)
2. ๋คํธ์ํฌ ์ ํ (์ฐ๊ฒฐ)
3. ์กฐํฉ ์ ํ(๋ชจ๋ ์กฐํฉ ๋ง๋ค๊ธฐ)
๊ทธ๋ผ ์ด์ ์ฌ๊ธฐ์ ์๋ฌธ, ์ด๋ค ๊ฑธ DFS๋ก, ์ด๋ค๊ฑธ BFS๋ก ํ์ด์ผํ๋?
์ฌ์ค, ์ฌ๋งํ ๋์ด๋์ ๋ฌธ์ ๋ ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ ์ ์๋ค๊ณ ํ๋ค.
(์ด๊ฒ ๋ง์ ๊น๋จน๊ณ ๋ญ๋๋ผ๋ฏธ ํ๊ณ ์๋ ๋์์ ,, ๋ฐ์ฑํ์)
ํ์ง๋ง ๊ทธ๋๋ ์ฐจ์ด์ ์ด ๋น์ฐํ ์กด์ฌํ๋ค!
๋ปํ ๊ฐ๋ ์ค๋ช ์ ํจ์คํ๊ณ , ์ฝํ ๋ฅผ ํ๊ธฐ์ํ ๋ฐฉ์์ผ๋ก๋ง ์ ๊ทผํ๊ฒ ๋ค.
1. DFS(๊น์ด ์ฐ์ ํ์)
DFS: ๋๋ผ๋ง ์ ํธ ํ๋๋ง ๋ชฐ์๋ณธ๋ค. -> ๊น์ด ์ฐ์ ํ์
DFS๋ ํ๋๋ง ํจ๊ธฐ ๋๋ฌธ์ ์ฌ๊ทํจ์๊ฐ ์ผ๋ฐ์ ์ด๋ค.

2. BFS(๊น์ด ์ฐ์ ํ์)
BFS: ์ฌ๋ฌ ๋๋ผ๋ง ํ๊ฐ์ฉ ๋ค ์ฑ๊ฒจ๋ด -> ๋๋น ์ฐ์ ํ์
BFS๋ ์ฌ๋ฌ๋์ ํ ๋์ฉ ํจ๋ ๊ฒ์ด๋ผ Queue/Linked List๊ฐ ์ผ๋ฐ์ .(์์๊ฐ ๋ณด์ฅ๋์ด์ผํ๊ธฐ ๋๋ฌธ์)
1.๊ฐ์ฅ ๋จผ์ ๋ฃ์๋ ๊ฑธ ๊บผ๋ด์
2. ์ฐ๊ฒฐ๋ ์ ์ Queue์ ๋ฃ๊ธฐ
3. Queue๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต

-> ๋ณธ์ธ์ด ๋ ์์ ์๊ณ ์์ ์ต๊ณ ํธํ ์๊ณ ๋ฆฌ์ฆ ์ฐ๋ฉด ๋จ.
DFS๋ ์ํ ์๊ฐ ๊ด์ ์์ ๋ณต๋ถ๋ณต, ์ด์ด ์ข์ผ๋ฉด ์ฒซ๋ฒ์งธ ๊ฒฝ์ฐ๊ณ ์์ข์ผ๋ฉด ๋ง์ง๋ง ๊ฒฝ์ฐ์. -> ์๊ฐ์ด๊ณผ๋ก ์คํจํ ๊ฐ๋ฅ์ฑ์์.
BFS๋ ์ด๋ฐ์๋ ๋๋ ค๋ณด์ด์ง๋ง ์๊ฐ๋ณต์ก๋๊ฐ ๋ฎ์. -> ์ฝํ ์ค ๋ค์ชฝ์ ๋์ด๋ ์๋ ๋ฌธ์ ๋ผ๋ฉด BFS ์ฌ์ฉ ๊ถ์ฅ
์์ ๋ก ์์๋ณด๊ธฐ
์ ๊ทธ๋ผ ์์ ๋ก ํ์ํด๋ณด์.
ํ์ด๋ณผ ๋ฌธ์ ๋ ํ๋ก๊ทธ๋๋จธ์ค - ํ๊ฒ ๋๋ฒ์ด๋ค.
๋ฌธ์ ์ค๋ช
n๊ฐ์ ์์ด ์๋ ์ ์๋ค์ด ์์ต๋๋ค. ์ด ์ ์๋ค์ ์์๋ฅผ ๋ฐ๊พธ์ง ์๊ณ ์ ์ ํ ๋ํ๊ฑฐ๋ ๋นผ์ ํ๊ฒ ๋๋ฒ๋ฅผ ๋ง๋ค๋ ค๊ณ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด [1, 1, 1, 1, 1]๋ก ์ซ์ 3์ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋ค์ฏ ๋ฐฉ๋ฒ์ ์ธ ์ ์์ต๋๋ค.
-1+1+1+1+1 = 3
+1-1+1+1+1 = 3
+1+1-1+1+1 = 3
+1+1+1-1+1 = 3
+1+1+1+1-1 = 3
์ฌ์ฉํ ์ ์๋ ์ซ์๊ฐ ๋ด๊ธด ๋ฐฐ์ด numbers, ํ๊ฒ ๋๋ฒ target์ด ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋ ์ซ์๋ฅผ ์ ์ ํ ๋ํ๊ณ ๋นผ์ ํ๊ฒ ๋๋ฒ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
ํ์ด
์ผํ ๋ณด๋ฉด ์ด๊ฒ ์ DFS/BFS ์ธ๊ฐ ์ถ์ง๋ง, ๊ฐ ์ซ์์ +/- ํ์ฌ๋ฅผ ๋ ธ๋๋ก์ ์ทจ๊ธํ๋ฉด DFS/BFS๋ฌธ์ ๋ก ์ฝ๊ฒ ํ ์ ์๋ค!
์ฆ, ์ฃ์ง ํํ๊ฐ ์๋๋๋ผ๋ ์ด์งํธ๋ฆฌ๋ก ๊ตฌ์ฑ ๊ฐ๋ฅํ๋ฉด DFS/BFS ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ ์ ์๋ ๊ฒ์ด๋ค.
๋จผ์ , DFS๋ก ์ ๊ทผํด๋ณด๊ฒ ๋ค!!!!(์ ์ด๊ฒ ๋ ์ฌ์ด ๊ฑฐ ๊ฐ์์.. ๋จ์ํด์)
๊ฐ๋จํ ๋ฌธ์ ์ด๋, DFS๋ก ํ์ด๋ ์๊ฐ์ด๊ณผ๋ฐ์ ๋จ์ง์์๋ค! ใฑใ ใท
DFS๋ ์ฌ๊ทํจ์๋ก ํผ๋ค! ๋ผ๋ ๊ณต์์ผ๋ก ๋ด๋จธ๋ฆฟ์์ ์ง๋ฐฐํ๊ณ ์๊ธฐ ๋๋ฌธ์
(์๋์๋ ์์ด์ ๋ค๋ง ์ฝํ
ํ์ ๊ทธ๋ ๊ฒ ์๊ฐํ๊ธฐ๋ก ํ์ต๋๋ค)
์ฌ๊ทํจ์์์ ๊ฐ์ฅ ์ค์ํ ๊ฑด ํ์ถ ์กฐ๊ฑด์ด๋ค.
๋๋ฌธ์, ํ์ถ ์กฐ๊ฑด์ ๋จผ์ ์ธ์ ๋ค.
๊ฐ์ฅ ๋ ๋ ธ๋(์ซ์)๊น์ง ํ์ํ๋ฉด ํ์ถ ํ๋ ๊ฒ์ด๋ค! (์ฐธ ์ฝ์ฃ ์?)
์ด๋, ๋ชจ๋ ๋ ธ๋๋ฅผ ํฉํ์ ๋ target๊ณผ ๋์ผํ๋ฉด +1 ํด์ฃผ๋ฉด ๋์ด๋ค.
ํ์ถ ์กฐ๊ฑด์ ์ธ์ ์ผ๋, ์ฌ๊ทํจ์ ๋ฃ์ด์ฃผ๋ฉด ๋!
๋ค๋ง, ์ค์ํ ๊ฑด ์๋ ๋์ ์ฝ๋์ ๊ฐ์ด, ๋ฐ๋ก ํจ์๋ฅผ ๋์ด ๊ตฌํํ๊ธฐ ๋๋ฌธ์, ์ ๋ต์ด ๋๋ cnt ๋ณ์๋ฅผ global๋ก ์ ์ธํด์ฃผ์ด์ผํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ 0 ์ผ๋ก ์ด๊ธฐํ๋ solution์์ ํด์ค์ผํ๋ค.
(๋ฐ๋ณด๊ฐ์ด, dfsํจ์ ๋ด์์ ์ด๊ธฐํํ ์ฌ๋,, ๊ทธ๊ฒ ๋์์)
์ด๋ ๊ฒ ์ ๊ทผํ๊ณ ๋๋ฉด, ๋๊ฒ ์ฌ์ด๋ฐ ์ฒ์์ ์ด๊ฑธ ๋ ์ฌ๋ฆฌ๋ ๊ณผ์ ์ด ์ ์์ง๋ ์ด๋ ค์ด์ง ๋ชจ๋ฅด๊ฒ๋ค..
def solution(numbers, target):
global cnt
cnt = 0
dfs(numbers, target, 0, 0)
return cnt
def dfs(numbers, target, depth, value):
global cnt
# ํ์ถ ์กฐ๊ฑด #
## depth ๋๊น์ง ํ์ํ๋๋ฐ target๊ณผ ๋์ผํ ๊ฒฝ์ฐ: cnt + 1
if depth == len(numbers) and value == target:
cnt += 1
return
elif depth == len(numbers):
return
# ์ฌ๊ท ํจ์ #
dfs(numbers, target, depth+1, value+numbers[depth])
dfs(numbers, target, depth+1, value-numbers[depth])
์ ๊ทธ๋ผ, BFS ๋ก ์ ๊ทผํด๋ณด๊ฒ ๋ค.
์์ธ์ง๋ชจ๋ฅด๊ฒ, ๋ BFS๊ฐ ๋ฌด์ญ์ง๋ง, ์ซ์ง ์๊ณ ํด๋ณด๊ฒ ๋ค.
DFS๋ ํ ๊ฒฝ์ฐ์๋ง ์ง์คํด์ ๊ทธ๊ฒ target๊ณผ ๋์ผํ์ง ํ์ธํ๊ณ , ๊ทธ๋ค์ ๊ฒฝ์ฐ๋ก ๋์ด๊ฐ๋ค๋ฉด
BFS๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ฐํด๋๊ณ , ๊ทธ ์ค target ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๊ฐ ๋ช๊ฐ์ธ์ง ์ธ์ด๋ณด๋ฉด ๋๋ค.
def solution(numbers, target):
## ๋ชจ๋ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ ๋ฆฌ์คํธ
leaves = [0]
cnt = 0
## ๋ชจ๋ ๊ฒฝ์ฐ์ ์ ๊ณ์ฐ
for num in numbers:
temp = []
# ์์ ๋
ธ๋ ๊ณ์ฐ
for leaf in leaves:
temp.append(leaf + num)
temp.append(leaf - num)
# ๋ค์ ๋ ๋ฒจ๋ก ์ด๋
leaves = temp
for leaf in leaves:
if leaf == target:
cnt += 1
return cnt
๋ด ์์ ๋, ์ด ๊ธ์ ์ฝ์ผ์๋ ๋ชจ๋ ๋ถ๋ค๋
DFS/BFS ๋ฅผ ์ดํดํ๊ธธ ๋ฐ๋ผ๋ฉฐ ๊ทธ๋ผ ์ด๋ง ...
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Python/์๊ณ ๋ฆฌ์ฆ] ํด์ Hash ์์ ์ ๋ณต(ํ๋ก๊ทธ๋๋จธ์ค - ์ ํ๋ฒํธ ๋ชฉ๋ก) (0) | 2026.01.04 |
|---|