문제 설명
- 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
접근 방식
- DFS 로 끝까지 탐색한다. +1 하고 넘기고 -1 하고 넘기고~
- 끝까지 간다음의 결과값이 target이랑 같다면,,! 결과 변수에 1을 더한다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace pgm_dev
{
class Program
{
int result = 0;
int targetNum;
int[] numbersList;
int[] operations = new int[2] { -1, 1 };
static void Main(string[] args)
{
Program sol = new Program();
int[] numbers = new int[] { 1, 1, 1, 1, 1 };
int target = 3;
int answer = sol.solution(numbers, target);
Console.WriteLine( "");
}
public int solution(int[] numbers, int target)
{
targetNum = target;
numbersList = numbers;
DFS(0, 0);
return result;
}
public void DFS(int tmpResult , int cnt)
{
if(cnt == numbersList.Length)
{
if (tmpResult == targetNum)
result++;
return;
}
foreach(int op in operations)
{
DFS(tmpResult + numbersList[cnt] * op, cnt + 1);
}
}
}
}