728x90

문제 설명

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

입출력

numbers target return
[1, 1, 1, 1, 1] 3 5

문제 예시를 보면 numbers 의 개수 가 5개 일때 2^5개의 경우를 만들 수 있습니다.

 

[ 0 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ]

 +    +     +    +     +

 -     -      -     -     -

각각의 경우에 +,- 두가지 선택 가능  따라서 2x2x2x2x2;

 

문제에서 numbers 최대 갯수는 20개 경우의 수는 2^20 으로 1,048,576가지 경우의 수가 있습니다.

깊이 우선 탐색을 이용해서 + 선택 -선택 두가지 갈래로 검사해 나가는 코딩을 이용해 보았습니다.

 

이와 비슷한 acmicpc.net에 연산자 끼워넣기가 있습니다. 한번 풀어보세요.

https://www.acmicpc.net/problem/14888

 

14888번: 연산자 끼워넣기

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 

www.acmicpc.net


#include <iostream>
#include <vector>
using namespace std;
int answer;
void dfs(vector<int> numbers, int target, int sum, int cnt)
{
	if(cnt == numbers.size())
    {
    	if(sum == target)
        {
        	answer++;
        }
    	return;
    }
    dfs(numbers, target, sum + numbers[cnt], cnt+1);
    dfs(numbers, target, sum - numbers[cnt], cnt+1);
}

int solution(vector<int> numbers, int target)
{
	answer = 0;
    dfs(numbers, target ,0, 0);
	return answer;
}
LIST

+ Recent posts