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

2021. 4. 7. 15:27

문제 μ„€λͺ…

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

 

μ •λ‹΅

def solution(numbers, target):
    answer = 0

    sum = [[] for _ in range(len(numbers))]
    sum[0].append(numbers[0])
    sum[0].append(-numbers[0])

    for i in range(1, len(numbers)):
        for k in sum[i - 1]:
            sum[i].append(k + numbers[i])
            sum[i].append(k - numbers[i])

    return sum[len(numbers)-1].count(target)

이차원 λ°°μ—΄ sum을 λ§Œλ“ λ‹€. 첫번째 μΈλ±μŠ€λŠ” 연산에 μ‚¬μš©λœ 숫자의 개수-1을 μ˜λ―Έν•œλ‹€.

예λ₯Ό λ“€μ–΄, 1개 숫자만 μ‚¬μš©ν•˜μ—¬ μ—°μ‚°ν•  경우 sum[0]에 μ €μž₯ν•˜κ³  λ§ˆμ§€λ§‰ 숫자의 μΈλ±μŠ€λŠ” 0이 λœλ‹€.

2개 숫자λ₯Ό μ‚¬μš©ν•˜μ—¬ μ—°μ‚°ν•  경우 sum[1]에 μ €μž₯ν•˜κ³  λ§ˆμ§€λ§‰ 숫자의 μΈλ±μŠ€λŠ” 1이 λœλ‹€.

첫번째 숫자만 μ‚¬μš©ν•  경우인 numbers[0]κ³Ό -numbers[0]을 sum[0]에 μ €μž₯ν•œλ‹€.

 

λ°˜λ³΅λ¬Έμ„ μ΄μš©ν•˜μ—¬ ν•΄λ‹Ή 숫자λ₯Ό μΆ”κ°€ν•˜μ—¬ 연산헀을 λ•Œλ₯Ό sum[i]에 μ €μž₯ν•œλ‹€.

ν•΄λ‹Ή 숫자λ₯Ό μΆ”κ°€ν•˜μ§€ μ•Šμ•˜μ„ λ•ŒλŠ” 인덱슀-1κΉŒμ§€ μ—°μ‚°ν–ˆμŒμ„ μ˜λ―Έν•˜λ―€λ‘œ

sum[i-1]의 λͺ¨λ“  값에 ν•΄λ‹Ή 숫자 numbers[i]λ₯Ό λ”ν•˜κ±°λ‚˜ λΊ€ 값을 sum[i]에 μ €μž₯ν•œλ‹€.

 

sum[len(numbers)-1]은 λͺ¨λ“  숫자λ₯Ό μ‚¬μš©ν•˜μ—¬ μ—°μ‚°ν•œ λͺ¨λ“  κ²½μš°κ°€ λ“€μ–΄μžˆμœΌλ―€λ‘œ

이 쀑 값이 targetκ³Ό 같은 κ°’λ§Œ countν•˜μ—¬ return ν•œλ‹€.

 

 

728x90

BELATED ARTICLES

more