๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜

[Python/์•Œ๊ณ ๋ฆฌ์ฆ˜] DFS์™€ BFS ์™„์ „์ •๋ณต(ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ํƒ€๊ฒŸ๋„˜๋ฒ„)

by eugene663 2026. 1. 3.

์ฝ”ํ…Œ์— ํ•ญ์ƒ ๋ฌป์ง€๋„ ๋”ฐ์ง€์ง€๋„ ์•Š๊ณ  ๋‚˜์˜ค๋Š” DFS/BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํƒ์ƒ‰ํ•ด๋ณผ ์‹œ๊ฐ„์ด๋‹ค.

 

์ฝ”ํ…Œ ๋งž์ถคํ˜• ๊ฐœ๋… ์„ค๋ช…

๋‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

์ค‘์š”ํ•˜์ง„ ์•Š์ง€๋งŒ, ๋ฌด์Šจ ๋œป์ด๋ƒ๋ฉด

๊ทธ๋ž˜ํ”„: ์—ฌ๋Ÿฌ ๊ฐœ์ฒด๋“ค์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ

ํƒ์ƒ‰: ํŠน์ • ๊ฐœ์ฒด๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ฆ‰, ์—ฌ๋Ÿฌ ๊ฐœ์ฒด๋“ค์ด ์—ฐ๊ฒฐ๋œ ๊ทธ๋ž˜ํ”„์—์„œ ํŠน์ • ๊ฐœ์ฒด๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์˜ฌ์‹œ๋‹ค.

 

๊ทธ๋Ÿผ ์–ด๋–ค ๋ฌธ์ œ๋ฅผ DFS/BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ’€์–ด์•ผํ•˜๋‚˜? 

๋Œ€ํ‘œ์  ๋ฌธ์ œ์œ ํ˜•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

1. ๊ฒฝ๋กœํƒ์ƒ‰ ์œ ํ˜•(์ตœ๋‹จ๊ฑฐ๋ฆฌ, ์‹œ๊ฐ„)

2. ๋„คํŠธ์›Œํฌ ์œ ํ˜• (์—ฐ๊ฒฐ)

3. ์กฐํ•ฉ ์œ ํ˜•(๋ชจ๋“  ์กฐํ•ฉ ๋งŒ๋“ค๊ธฐ)

 

๊ทธ๋Ÿผ ์ด์ œ ์—ฌ๊ธฐ์„œ ์˜๋ฌธ, ์–ด๋–ค ๊ฑธ DFS๋กœ, ์–ด๋–ค๊ฑธ BFS๋กœ ํ’€์–ด์•ผํ•˜๋‚˜?

์‚ฌ์‹ค, ์›ฌ๋งŒํ•œ ๋‚œ์ด๋„์˜ ๋ฌธ์ œ๋Š” ๋‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

(์ด๊ฒƒ ๋งˆ์ € ๊นŒ๋จน๊ณ  ๋ญ๋“œ๋ผ๋ฏธ ํ•˜๊ณ  ์žˆ๋˜ ๋‚˜์ž์‹ ,, ๋ฐ˜์„ฑํ•˜์ž)

 

ํ•˜์ง€๋งŒ ๊ทธ๋ž˜๋„ ์ฐจ์ด์ ์ด ๋‹น์—ฐํžˆ ์กด์žฌํ•œ๋‹ค! 

๋ป”ํ•œ ๊ฐœ๋… ์„ค๋ช…์€ ํŒจ์Šคํ•˜๊ณ , ์ฝ”ํ…Œ๋ฅผ ํ’€๊ธฐ์œ„ํ•œ ๋ฐฉ์‹์œผ๋กœ๋งŒ ์ ‘๊ทผํ•˜๊ฒ ๋‹ค.

1. DFS(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)

DFS: ๋“œ๋ผ๋งˆ ์ „ํŽธ ํ•˜๋‚˜๋งŒ ๋ชฐ์•„๋ณธ๋‹ค. -> ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰

DFS๋Š” ํ•œ๋†ˆ๋งŒ ํŒจ๊ธฐ ๋•Œ๋ฌธ์— ์žฌ๊ท€ํ•จ์ˆ˜๊ฐ€ ์ผ๋ฐ˜์ ์ด๋‹ค.

DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

2. BFS(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)

BFS: ์—ฌ๋Ÿฌ ๋“œ๋ผ๋งˆ ํ•œ๊ฐœ์”ฉ ๋‹ค ์ฑ™๊ฒจ๋ด„ -> ๋„ˆ๋น„ ์šฐ์„  ํƒ์„

BFS๋Š” ์—ฌ๋Ÿฌ๋†ˆ์„ ํ•œ ๋Œ€์”ฉ ํŒจ๋Š” ๊ฒƒ์ด๋ผ Queue/Linked List๊ฐ€ ์ผ๋ฐ˜์ .(์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—)

 1.๊ฐ€์žฅ ๋จผ์ € ๋„ฃ์—ˆ๋˜ ๊ฑธ ๊บผ๋‚ด์„œ

 2. ์—ฐ๊ฒฐ๋œ ์ ์„ Queue์— ๋„ฃ๊ธฐ

 3. Queue๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต

 

BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

 

 

 

-> ๋ณธ์ธ์ด ๋” ์ž์‹ ์žˆ๊ณ  ์†์— ์ต๊ณ  ํŽธํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์“ฐ๋ฉด ๋จ.

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 ๋ฅผ ์ดํ•ดํ–ˆ๊ธธ ๋ฐ”๋ผ๋ฉฐ ๊ทธ๋Ÿผ ์ด๋งŒ ...