🐍 μ½”λ”©ν…ŒμŠ€νŠΈ λŒ€λΉ„ : PS

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] νƒ€κ²Ÿ λ„˜λ²„ (level2, python)

개발자 HOON 2022. 9. 12. 18:01

문제 μ„€λͺ…

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 ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”.


μ œν•œμ‚¬ν•­

 

  • μ£Όμ–΄μ§€λŠ” 숫자의 κ°œμˆ˜λŠ” 2개 이상 20개 μ΄ν•˜μž…λ‹ˆλ‹€.
  • 각 μˆ«μžλŠ” 1 이상 50 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • νƒ€κ²Ÿ λ„˜λ²„λŠ” 1 이상 1000 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

μž…μΆœλ ₯ 예 μ„€λͺ…

 

μž…μΆœλ ₯ 예 #1

문제 μ˜ˆμ‹œμ™€ κ°™μŠ΅λ‹ˆλ‹€.

 

μž…μΆœλ ₯ 예 #2

+4+1-2+1 = 4
+4-1+2-1 = 4
  • 총 2가지 방법이 μžˆμœΌλ―€λ‘œ, 2λ₯Ό return ν•©λ‹ˆλ‹€.

풀이 μ½”λ“œ

from collections import deque

def bfs(numbers, target):
    global answer
    queue = deque()
    queue.append([0, 0])
    
    while queue:
        idx, temp = queue.popleft()
        if idx == len(numbers) and temp == target:
            answer += 1
        else:
            if idx != len(numbers):
                queue.append([idx+1, temp + numbers[idx]])
                queue.append([idx+1, temp - numbers[idx]])
            
    return
        

def solution(numbers, target):
    global answer
    answer = 0
    bfs(numbers, target)
    return answer

BFS(λ„ˆλΉ„ μš°μ„  탐색)으둜 κ΅¬ν˜„ν–ˆλ‹€.

사싀 λͺ¨λ“  경우λ₯Ό ν™•μΈν•˜λŠ” 브루트 포슀 문제인데, 이λ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œ BFSλ₯Ό ν™œμš©ν•œ 것이라고 보면 μ’‹λ‹€.

 

큐에 [numbers의 index, 총 ν•©]을 λ„£κ³ , μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•œλ‹€.

큐 λ‚΄λΆ€κ°€ λ‹€ 빌 λ•ŒκΉŒμ§€ numbers λ‚΄λΆ€ μš”μ†Œλ₯Ό λ‹€ κ±°μ³€λŠ”μ§€, 총 합이 κ΅¬ν•˜κ³ μž ν•˜λŠ” κ°’κ³Ό 같은지 κ³„μ†ν•΄μ„œ ν™•μΈν•œλ‹€.