Algorithm/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / Python] νƒ€κ²Ÿ λ„˜λ²„

meeeeejin 2021. 3. 15. 21:34

문제 링크: programmers.co.kr/learn/courses/30/lessons/43165

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - νƒ€κ²Ÿ λ„˜λ²„

n개의 음이 μ•„λ‹Œ μ •μˆ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. 이 수λ₯Ό 적절히 λ”ν•˜κ±°λ‚˜ λΉΌμ„œ νƒ€κ²Ÿ λ„˜λ²„λ₯Ό λ§Œλ“€λ €κ³  ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ [1, 1, 1, 1, 1]둜 숫자 3을 λ§Œλ“€λ €λ©΄ λ‹€μŒ λ‹€μ„― 방법을 μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€. -1+1+1+1+1 = 3 +1-1+1+1+

programmers.co.kr

 

문제 μ„€λͺ…

λͺ¨λ“  경우의 수λ₯Ό DFS(깊이 μš°μ„  탐색)으둜 ν™•μΈν•΄μ„œ νƒ€κ²Ÿ λ„˜λ²„λ₯Ό λ§Œλ“œλŠ” 경우λ₯Ό μ…ŒμŠ΅λ‹ˆλ‹€. 

 

 

 

μ†ŒμŠ€μ½”λ“œ

answer = 0

def dfs(idx, numbers, total_sum, target):
    global answer
    n = len(numbers)
    # λ§ˆμ§€λ§‰ μ›μ†ŒκΉŒμ§€ κ³„μ‚°ν–ˆλ‹€λ©΄ return
    if idx == n - 1:
        # νƒ€κ²Ÿ λ„˜λ²„λ₯Ό λ§Œλ“œλŠ” 경우
        if total_sum == target:
            answer += 1
        return
    # λ‹€μŒ μ›μ†Œλ₯Ό 더할 경우
    dfs(idx + 1, numbers, total_sum + numbers[idx + 1], target)
    # λ‹€μŒ μ›μ†Œλ₯Ό λΊ„ 경우
    dfs(idx + 1, numbers, total_sum - numbers[idx + 1], target)

def solution(numbers, target):
    global answer
    dfs(-1, numbers, 0, target)
    return answer

 

 

 

 

λ‹€λ₯Έ μ‚¬λžŒμ˜ 풀이

βœ” μž¬κ·€λ₯Ό μ΄μš©ν•œ 풀이

예λ₯Ό λ“€μ–΄ numbers = [1, 2, 3, 4, 5], target = 6 일 경우λ₯Ό μƒκ°ν•΄λ΄…μ‹œλ‹€. 

λ§Œμ•½ [2, 3, 4, 5]둜 5 λ˜λŠ” 7을 λ§Œλ“€ 수 μžˆλ‹€λ©΄, 1을 λ”ν•˜κ±°λ‚˜ λΉΌμ„œ νƒ€κ²Ÿ λ„˜λ²„μΈ 6을 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. 

이와 같은 μ•„μ΄λ””μ–΄λ‘œ μž¬κ·€ ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ ν’€μ΄λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. 

def solution(numbers, target):
    # numbers둜 target을 λ§Œλ“€ 수 μžˆλŠ” 경우
    if not numbers and target == 0 :
        return 1
    # numbers둜 target을 λ§Œλ“€ 수 μ—†λŠ” 경우
    elif not numbers:
        return 0
    else:
        # 리슀트의 μ•ž μ›μ†ŒλΆ€ν„° μˆœμ„œλŒ€λ‘œ
        # (ν•΄λ‹Ή μ›μ†Œλ₯Ό λ”ν–ˆμ„ λ•Œμ˜ μ •λ‹΅ 개수) + (ν•΄λ‹Ή μ›μ†Œλ₯Ό 뺐을 λ•Œμ˜ μ •λ‹΅ 개수)
        return solution(numbers[1:], target-numbers[0]) + solution(numbers[1:], target+numbers[0])

 

 

βœ” productλ₯Ό μ΄μš©ν•œ μ™„μ „ 탐색 풀이

from itertools import product

def solution(numbers, target):
    _list = [(x, -x) for x in numbers]
    s = list(map(sum, product(*_list)))
    return s.count(target)

 

728x90