λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’» DEV/γ„΄ problems

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 깊이/λ„ˆλΉ„ μš°μ„  탐색(DFS/BFS) : νƒ€κ²Ÿ λ„˜λ²„

by vodkassi 2021. 7. 8.
728x90

문제 μ„€λͺ…

 

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 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.


μž…μΆœλ ₯ 예

 

numbers target return
[1, 1, 1, 1, 1] 3 5

 

 

λ‚˜μ˜ μ†”λ£¨μ…˜ (μ ‘κ·Ό 방법)

 

dfs/bfs μœ ν˜• λ¬Έμ œλŠ” 보자마자 "μž¬κ·€?" λ₯Ό μ‘°μ‹¬μŠ€λ ˆ 묻게 λœλ‹€. 이번 문제 μ—­μ‹œ κΉŠμ΄μš°μ„  νƒμƒ‰μ˜ μ •μ„μ΄μ—ˆκΈ° λ•Œλ¬Έμ— μž¬κ·€λ₯Ό λ‹Ήμ—°νžˆ 써야 ν•œλ‹€λŠ” κ°€μ • ν•˜μ— μ ‘κ·Όν•΄ λ³΄μ•˜λ‹€. 

 

κ°€μž₯ ν¬μΈνŠΈκ°€ λ˜μ—ˆλ˜ 뢀뢄은 ν˜„μž¬ 숫자 이후 λ“€μ–΄μ˜€λŠ” μˆ«μžμ— + 와 - κ°€ μ˜€λŠ” 경우 두 가지 λͺ¨λ‘λ₯Ό κ²€ν† ν•΄μ•Ό ν•œλ‹€λŠ” 것이닀. μ–΄λ–€ μ‹μœΌλ‘œλ“  배열이 빈 배열이 될 λ•ŒκΉŒμ§€ 숫자λ₯Ό μ•žμ—μ„œλΆ€ν„° ν•˜λ‚˜μ”© λΉΌμ„œ +, - λ₯Ό λΆ™μ—¬μ•Όκ² λ‹€λŠ” 생각이 λ“€μ—ˆλ‹€. λ°°μ—΄λ‘œ λͺ¨λ“  쑰합을 λ§Œλ“€μžλ‹ˆ μ‹œκ°„ λ³΅μž‘λ„κ°€ μš°λ €λ˜μ—ˆλŠ”λ°, target 이 μ •μˆ˜λ‘œ μ£Όμ–΄μ‘Œλ‹€λŠ” 점이 νžŒνŠΈκ°€ λ˜μ—ˆλ‹€. 

 

target μ—μ„œ λ°°μ—΄μ—μ„œ λΊ€ ν˜„μž¬ 숫자λ₯Ό λΉΌκ±°λ‚˜ λ”ν•˜λ©΄ κ²°κ΅­ + 와 - 기호λ₯Ό λΆ™μ΄λŠ” κ²ƒμ΄λ‚˜ λ§ˆμ°¬κ°€μ§€μ΄κ³ , λͺ¨λ“  κ³Όμ • 이후에 target 이 μ •ν™•νžˆ 0이 λœλ‹€λ©΄ μ΄λŠ” ν•΄λ‹Ή μˆ«μžλ“€μ˜ (μœ λ‹ˆν¬ν•œ) μ‘°ν•©μœΌλ‘œ target 을 λ§Œλ“€ 수 μžˆλ‹€λŠ” 뜻이 λ˜λ―€λ‘œ 1을 μΆ”κ°€ν•΄μ€€λ‹€. 그렇지 μ•Šμ„ 경우, 0 을 μΆ”κ°€ν•΄ μ£Όμ–΄ 합산될 λ•Œ 영ν–₯을 주지 μ•Šλ„λ‘ ν•œλ‹€. 

 

κ·Έλ¦¬ν•˜μ—¬ μ™„μ„±ν•œ μ½”λ“œμ΄λ‹€. 

 

def solution(numbers, target):
    
    if len(numbers) == 0:
        if target == 0:
            return 1
        else:
            return 0
    
    return solution(numbers[1:], target - numbers[0]) + solution(numbers[1:], target - numbers[0] * -1)

 

**μΆ”κ°€ μ„€λͺ…

numbers = [1,2,3],  target = 6 을 κ΅¬ν•˜κ³ μž ν•˜λŠ” 경우

target(6) - 1,  μž¬κ·€([2,3]) 
	target(5) - 2 + μž¬κ·€([3])
		target(3) - 3 + μž¬κ·€([])  -> target == 0, 1 λ°˜ν™˜
		target(3) - -3 + μž¬κ·€([]) -> target == 6, 0 λ°˜ν™˜
	target(5) - -2 + μž¬κ·€([3])
		target(7) - 3 + μž¬κ·€([]) -> target == 4, 0 λ°˜ν™˜
		target(7) - -3 + μž¬κ·€([]) -> target == 10, 0 λ°˜ν™˜
target(6) - -1 + μž¬κ·€([2,3])
	target(7) - 2 + μž¬κ·€([3])
		target(4) - 3 + μž¬κ·€([]) -> target == 1, 0 λ°˜ν™˜
		target(4) - -3 + μž¬κ·€([]) -> target == 7, 0 λ°˜ν™˜
	target(7) - -2 + μž¬κ·€([3])
		target(9) - 3 + μž¬κ·€([]) -> target == 6, 0 λ°˜ν™˜
		target(9) - -3 + μž¬κ·€([]) -> target == 12, 0 λ°˜ν™˜



κ²°λ‘ : ν•©μ‚°ν•˜μ—¬ μ–»μ–΄μ§€λŠ” μˆ˜λŠ” 1μ΄λ―€λ‘œ 경우의 μˆ˜λŠ” 1κ°œμ΄λ‹€. 


졜초 target 에 도달할 수 μžˆλŠ” 숫자의 쑰합을 κ΅¬ν•˜λŠ” 방법: 1이 λ°˜ν™˜λ˜λŠ” μž¬κ·€μ— μ‚¬μš©λ˜μ—ˆλ˜ μˆ«μžλ“€μ˜ λΆ€ν˜Έλ₯Ό λ°˜λŒ€λ‘œ 돌리면 λœλ‹€.

μœ„μ— λ‚˜μ˜¨ μ˜ˆμ‹œμ˜ 경우, [+1, +2, +3] 만이 닡이 될 수 μžˆλ‹€. 

λŒ“κΈ€