알고리즘 풀이/프로그래머스

[Level 2] 타겟 넘버

mhko411 2021. 3. 3. 10:08
728x90

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의 수를 모두 사용했을 때 target과 비교해본다. 

이문제를 dfs와 bfs로 모두 풀어보자

 

구현

▶ DFS

각 상황에서 numbers에 있는 수를 더하거나 빼는 것을 dfs함수를 재귀호출 하여 구현하였다.

result = 0
def dfs(idx, total, numbers, target):
    global result
    if idx == len(numbers):
        if total == target:
            result += 1
        return
    else:
        dfs(idx+1, total+numbers[idx], numbers, target)
        dfs(idx+1, total-numbers[idx], numbers, target)
        
def solution(numbers, target):
    answer = 0
    dfs(0, 0, numbers, target)
    answer = result
    return answer

 

▶ BFS

큐를 활용하여 구현할 수도 있다.

이 문제에서 관건은 덧셈을 하거나 뺄셈을 하거나를 어떻게 구현하는지에 있는 것 같다.

from _collections import deque
def solution(numbers, target):
    answer = 0
    q = deque()
    q.append((numbers[0], 0))
    q.append((-numbers[0], 0))
    while q:
        total, idx = q.popleft()
        idx += 1
        if idx == len(numbers):
            if total == target:
                answer += 1
        else:
            q.append((total+numbers[idx], idx))
            q.append((total-numbers[idx], idx))
    return answer

'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글

[Level 2] H-Index  (0) 2021.03.03
[Level 3] 여행 경로  (0) 2021.03.03
[Level 3] 가장 먼 노드  (0) 2021.03.02
[프로그래머스] 같은 숫자는 싫어  (0) 2021.02.28
[Level 2] 큰 수 만들기  (0) 2021.02.27