๐Ÿ“š Study/Baekjoon

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค | dfs/bfs | ํƒ€๊ฒŸ ๋„˜๋ฒ„

์œฐ๊ฐฑ 2025. 10. 9. 21:24

2026.04.01

์•„์˜ˆ ์™ผ์˜ค๋ฅผ ๋‚˜๋ˆ ์„œ ๋”ํ•˜๋Š”๊ฒŒ ๋” ์ข‹์•˜์„ ๊ฒƒ ๊ฐ™๊ธฐ๋„ ํ•˜๋‹ค

๊ฐ™์€ dfs์ง€๋งŒ ์ด ์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„๋‹จํ•จ

def dfs(curr, numbers, target, i):
    # 0 > 0-4=-4 > -4-1=-5 > -5-2=-7 > -7-1=-8
    if i == len(numbers):
        if curr == target:
            return 1
        return 0
    
    left = dfs(curr-numbers[i], numbers, target, i+1)
    right = dfs(curr+numbers[i], numbers, target, i+1)
    
    return left + right
    
    
def solution(numbers, target):
    # dfs ์ ‘๊ทผ๋ฒ•
    # ์‹œ์ž‘ ๊ฐ’ 0์—์„œ ์ขŒ์šฐ๋กœ -1, +1 ๋‚˜๋ˆ ์„œ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ
    
    return dfs(0, numbers, target, 0)

 


2026.04.01

itertools๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ›จ์”ฌ ๋ฌธ์ œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ’€๊ธดํ•จ

from itertools import product

def solution(numbers, target):
    # ๊ฒฐ๊ตญ ๋ชจ๋“  ์กฐํ•ฉ์„ ๊ณ„์‚ฐํ•ด๋ณด๊ณ  target์ด๋ž‘ ๊ฐ™์€ ์ˆ˜๋ฅผ return ํ•ด์•ผ ํ•œ๋‹ค
    # ๊ฐ ์ˆซ์ž ์•ž์— -1 ํ˜น์€ 1์„ ๊ณฑํ•ด์„œ ๋‹ค ๋”ํ•˜๋ฉด ๋˜๋Š” ๊ตฌ์กฐ
    # ๊ทธ ๋ชจ๋“  ์กฐํ•ฉ์„ ์–ด๋–ป๊ฒŒ ์…€ ๊ฒƒ์ธ๊ฐ€
    minus_plus = [-1, 1]
    answer = 0
    for perm in product(minus_plus, repeat=len(numbers)):
        # [-1,1,-1,1,1]
        number = 0
        for idx, p in enumerate(perm):
            number += p * numbers[idx]
        if number == target:
            answer += 1
    return answer

์‚ฌ์‹ค dfs/bfs๋กœ ๋ถ„๋ฅ˜๋˜์–ด์žˆ์ง€ ์•Š์œผ๋ฉด ๊ทธ๋ž˜ํ”„๋กœ ์ ‘๊ทผํ•ด์„œ ํ’€ ์ƒ๊ฐ์„ ์•ˆํ–ˆ์„ ๊ฒƒ ๊ฐ™๊ธฐ๋„ ํ•˜๋‹ค ,, ใ… 

๊ทธ๋Ÿฌ๋‚˜ ์–ด์จŒ๋“  ํฌ๊ฒŒ ์–ด๋ ต์ง€ ์•Š๊ฒŒ ์ž˜ ์ ‘๊ทผํ•จ

global ๋ณ€์ˆ˜๋„ ์ž˜ ์“ฐ๋Š”๊ฒŒ ์ค‘์š”ํ•˜๋‹ค

answer = 0
def dfs(numbers, curr, target, result, depth):
    global answer
    if depth == len(numbers):
        if result == target:
            answer += 1
        return
    
    dfs(numbers, curr+1, target, result+numbers[curr], depth+1)
    dfs(numbers, curr+1, target, result-numbers[curr], depth+1)
    
    
def solution(numbers, target):
    # answer = 0
    dfs(numbers, 0, target, 0, 0)
    return answer