나만의 작은 도서관
문제 43165. 타겟 넘버 본문
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/43165
난이도 : 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;
}
'프로그래머스 문제풀이 > 코드카타' 카테고리의 다른 글
문제 154539. 뒤에 있는 큰 수 찾기 (0) | 2024.07.21 |
---|---|
문제 84512. 모음사전 (0) | 2024.07.20 |
문제 92335. k진수에서 소수 개수 구하기 (1) | 2024.07.18 |
문제 92341. 주차 요금 계산 (0) | 2024.07.17 |
문제 87946. 피로도 (0) | 2024.07.17 |