나만의 작은 도서관

문제 43165. 타겟 넘버 본문

프로그래머스 문제풀이/코드카타

문제 43165. 타겟 넘버

pledge24 2024. 7. 19. 10:00

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/43165

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

난이도 : Lv.2

 

문제 요약 설명

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 함수를 작성해주세요.

입력

  • 사용할 수 있는 숫자가 담긴 배열 numbers
  • 타겟 넘버 target

입력 제한

  • 주어지는 숫자의 개수는 2개 이상 20개 이하입니다.
  • 각 숫자는 1 이상 50 이하인 자연수입니다.
  • 타겟 넘버는 1 이상 1000 이하인 자연수입니다.

입력 예제

// input
[1, 1, 1, 1, 1] // numbers
3  // target

// ans
5

 

풀이 방식

완전 탐색(BFS사용) 을 사용한 다음, 결과에서 target과 동일한 값이면 개수(answer)를 1씩 증가시켜주면 된다. 완전 탐색을 할 때 각 숫자를 + 또는 -로 더할 수 있기 때문에 +랑 -하나씩 push해줘야한다. 

 

정답 코드 

더보기
더보기
#include <string>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;

int solution(vector<int> numbers, int target) {
    int answer = 0;
      
    queue<int> q;

    for(int elem : numbers){
           
        // q가 비어있을 때 (처음 들어올 때) 진입.
        if(q.empty()){
            q.push(elem);
            q.push(-elem);
            continue;
        }
        
        int q_size = q.size();
        
        for(int i = 0; i < q_size; i++){
            
            int cur_x = q.front(); q.pop();
                 
            q.push(cur_x + elem);
            q.push(cur_x - elem);
        }

    }

    while(!q.empty()){
        int cur_x = q.front(); q.pop();
        if(cur_x == target) answer++;
    }
    return answer;
}