on
깊이/너비 우선 탐색(DFS/BFS) > 타겟 넘버 (Level2)
깊이/너비 우선 탐색(DFS/BFS) > 타겟 넘버 (Level2)
문제 설명
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
소스코드
#include #include using namespace std; void DFS(vector& numbers, int& answer, int target, int count, int result) { //끝까지 다돌았을 경우 if (count == numbers.size() - 1) { if (target == result + numbers[count]) answer++; if (target == result - numbers[count]) answer++; return; } //현재 계산한 정수의 갯수 count++; //+인 경우와 - 인 경우 분기점을 둬서 재귀함수 DFS(numbers, answer, target, count, result + numbers[count - 1]); //+인경우 DFS(numbers, answer, target, count, result - numbers[count - 1]); //-인경우 } int solution(vector numbers, int target) { int answer = 0; DFS(numbers, answer, target, 0, 0); return answer; }
생각해 볼 다른사람 코드
#include #include using namespace std; int solution(vector numbers, int target) { int answer = 0; int size = 1 << numbers.size(); for(int i = 1 ; i < size ; i++){ int temp = 0; for(int j = 0 ; j < numbers.size() ; j++) { if(i &(1 << j)){ temp -= numbers[j]; } else temp += numbers[j]; } if(temp == target) answer++; } return answer; }
생각해 볼 것
경우의 수가 +,- 두가지여서 이진 트리로 그려보니 2^depth인 리프노드 공식이 까진 생각했다.
2진수인 경우에 비트시프트연산으로 계산하는 방법이 있으니 생각해보자
1<< number.size();
from http://mindole94.tistory.com/211 by ccl(A) rewrite - 2021-11-06 01:00:39