프로그래머스

프로그래머스 - 타겟 넘버

yanJuicy 2021. 8. 24. 01:06
반응형

문제

 

https://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

 

 

풀이

 

numbers의 인덱스를 노드로 생각하고, 각 인덱스를 방문할 때마다 인덱스에 해당하는 값을 더한 값과, 뺀 값을 이용해서 dfs, bfs 탐색을 진행한다. 탐색이 끝난 후 중첩한 값과 target을 비교한다.

 

 

코드

 

python - dfs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
answer = 0
 
def dfs(idx, numbers, target, cur):
    if idx == len(numbers):
        if cur == target:
            global answer
            answer += 1
        return
    dfs(idx + 1, numbers, target, cur + numbers[idx])
    dfs(idx + 1, numbers, target, cur - numbers[idx])
 
def solution(numbers, target):
    dfs(0, numbers, target, 0)
    return answer
cs

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def solution(numbers, target):
    answer = 0
    st = []
    st.append([0, numbers[0]])
    st.append([0-1 * numbers[0]])
 
    while st:
        idx, value = st.pop()
        if idx + 1 == len(numbers):
            if value == target:
                answer += 1
        else:
            st.append([idx + 1, value + numbers[idx + 1]])
            st.append([idx + 1, value - numbers[idx + 1]])
 
    return answer
cs

 

 

python - bfs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from collections import deque
 
def solution(numbers, target):
    answer = 0
    q = deque()
    q.append([0, numbers[0]])
    q.append([0-1 * numbers[0]])
 
    while q:
        idx, value = q.popleft()
        if idx + 1 == len(numbers):
            if value == target:
                answer += 1
        else:
            q.append([idx + 1, numbers[idx + 1+ value])
            q.append([idx + 1-1 * numbers[idx + 1+ value])
 
    return answer
cs

 

 

반응형