Problem Solving/Programmers

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

minzhen 2022. 6. 17. 16:02

πŸ“’  문제 정보

 

 

πŸ”’  문제 μ„€λͺ…

더보기

문제 μ„€λͺ…

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
[4, 1, 2, 1] 4 2

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

μž…μΆœλ ₯ 예 #1

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

μž…μΆœλ ₯ 예 #2

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

 

 

πŸ”‘  문제 풀이

방법 1.BFS ν™œμš©

BFSλ₯Ό ν™œμš©ν•œ 풀이이닀. 이쀑 for문을 ν™œμš©ν•˜μ—¬ parent λ…Έλ“œμ™€ κ·Έ μžμ‹ λ…Έλ“œμ˜ ν•©/μ°¨ 관계λ₯Ό κ΅¬ν˜„ν–ˆλ‹€. 

def solution(numbers, target):
    cnt = 0
    nodes = [0]
    
    for node in numbers:
        temp = []
        for parent in nodes:           # λΆ€λͺ¨λ…Έλ“œ +- λ’€μ˜ μžμ‹
            temp.append(parent + node)
            temp.append(parent - node)
        nodes = temp
        
    for leaf in nodes:                 # λ¦¬ν”„λ…Έλ“œ 쀑 νƒ€κ²Ÿλ„˜λ²„ μ°ΎκΈ°
        if leaf == target:
            cnt += 1
    
    return cnt

 

방법 2. DFS ν™œμš©

μž¬κ·€λ₯Ό 톡해 반볡문 없이도 과정을 λ°˜λ³΅ν•  수 μžˆλ‹€.

1.depth == len(numbers)일 λ•Œ : sum(numbers) == target이면 1을 returnν•˜κ³ , κ·Έ 1을 answer에 더해쀀닀.

2.depth != len(numbers) 일 λ•Œμ—λŠ”, numbers[depth]이 μ–‘μˆ˜μΌ λ•Œ ν•œ 번 DFS()ν•¨μˆ˜λ₯Ό 돌리고, 음수일 λ•Œ ν•œ 번 더 λŒλ¦°λ‹€.

 

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

def DFS(numbers, target, depth):
    answer = 0
    
    if depth == len(numbers):			# λ¦¬ν”„λ…Έλ“œμ—μ„œ
        if sum(numbers) == target:		# νƒ€κ²Ÿ λ„˜λ²„μ΄λ©΄ 1,
            return 1					# μ•„λ‹ˆλ©΄ 0을 λ¦¬ν„΄ν•œλ‹€.
        else: return 0
    else:
        answer += DFS(numbers, target, depth+1)
        numbers[depth] *= -1
        answer += DFS(numbers, target, depth+1)
        return answer

 

 

 

πŸ’‘  What I learned

 

πŸ“
BFS - 일반적으둜 queueλ₯Ό ν™œμš©ν•˜μ—¬ κ΅¬ν˜„ / DFS - μž¬κ·€ν˜ΈμΆœ, stack을 ν™œμš©ν•˜μ—¬ κ΅¬ν˜„

깊이 μš°μ„ νƒμƒ‰(DFS)

깊이 μš°μ„ νƒμƒ‰ DFSλŠ” 갈 수 μžˆλŠ” 만큼 μ΅œλŒ€ν•œ 깊이 κ°€κ³ , 더 이상 갈 곳이 μ—†λ‹€λ©΄ 이전 μ •μ μœΌλ‘œ λŒμ•„κ°€λŠ” λ°©μ‹μœΌλ‘œ κ·Έλž˜ν”„λ₯Ό μˆœνšŒν•˜λŠ” 방식

넓이 μš°μ„ νƒμƒ‰(BFS)

넓이 μš°μ„ νƒμƒ‰ BFSλŠ” μ‹œμž‘μ •μ μ„ λ°©λ¬Έν•œ ν›„ μ‹œμž‘ 정점에 μΈμ ‘ν•œ λͺ¨λ“  정점을 λ°©λ¬Έν•œ ν›„ μ‹œμž‘ 정점에 μΈμ ‘ν•œ λͺ¨λ“  정점듀을 μš°μ„ λ°©λ¬Έν•˜λŠ” 방법

 

BFS, DFSλ₯Ό μ‹€μ œ λ¬Έμ œν’€μ΄μ—μ²˜μŒ μ μš©ν•΄λ³΄μ•˜λ‹€. μ•„직은 λ‘˜ λ‹€ μ΅μˆ™ν•˜μ§€λŠ” μ•Šκ³ , queueλ‚˜ stack, μž¬κ·€λ₯Ό ν™œμš©ν•˜λŠ” 법은 아직 손에 읡지 μ•Šμ•˜μœΌλ‚˜ μ•žμœΌλ‘œ 계속 풀어보며 손에 μ΅ν˜€μ•Όκ² λ‹€.