[알고리즘] Programmers 타켓 넘버

김상현·2022년 8월 1일
0

알고리즘

목록 보기
150/301
post-thumbnail

[Programmers] 타겟 넘버 바로가기

📍 문제 설명

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 이하인 자연수입니다.

📍 입출력 예

numberstargetreturn
[1, 1, 1, 1, 1]35
[4, 1, 2, 1]42

📍 입출력 예 설명

입출력 예 #1

문제 예시와 같습니다.

입출력 예 #2

+4+1-2+1 = 4
+4-1+2-1 = 4
  • 총 2가지 방법이 있으므로, 2를 return 합니다.

📍 풀이

✍ 적용 알고리즘

  • 너비 우선 탐색(BFS) 알고리즘 적용하여 문제를 해결하였다.

✍ 문제 풀이

  1. 너비 우선 탐색(BFS) 알고리즘을 적용하기 위해 deque[첫번째 원소의 양의 값, 진행한 원소의 개수], [첫번째 원소의 음의 값, 진행한 원소의 개수] 를 추가한다.
  2. D 에서 가장 첫번째 원소를 popleft() 를 통해 현재 원소의 값(num) 과 현재 원소의 개수(cnt)를 얻는다.
  3. 만약 현재 원소의 개수(cnt)가 주어진 정수의 개수와 같고, 현재 원소의 값(num)과 target의 값이 같다면 answer 의 값을 1 증가시킨다.
  4. 만약 현재 원소의 개수(cnt)가 주어진 정수의 개수와 같지 않다면, D[현재 원소의 값 + 다음 정수, 원소의 개수 + 1][현재 원소의 값 - 다음 정수, 원소의 개수 + 1] 의 값을 추가한 후 2번으로 돌아간다.
  5. 모든 반복문이 종료되면 answer 를 반환한다.

✍ 코드

from collections import deque
def solution(numbers, target):
    answer = 0
    N = len(numbers)
    D = deque([[numbers[0],1],[-numbers[0],1]])
    while D:
        num, cnt = D.popleft()
        if cnt == N:
            if num == target: answer += 1
            continue
        D.append([num+numbers[cnt],cnt+1])
        D.append([num-numbers[cnt],cnt+1])
    return answer
profile
목적 있는 글쓰기

0개의 댓글