개발/프로그래머스

깊이/너비 우선 탐색(DFS/BFS) > 타겟 넘버 (Level2)

민돌이2 2021. 11. 6. 00:33

문제 링크

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 설명

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

 

입출력 예

 

입출력 예 설명

입출력 예 #1

문제 예시와 같습니다.

입출력 예 #2

+4+1-2+1 = 4
+4-1+2-1 = 4
  • 총 2가지 방법이 있으므로, 2를 return 합니다.

 

소스코드

#include <string>
#include <vector>

using namespace std;

void DFS(vector<int>& 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<int> numbers, int target) 
{
	int answer = 0;

	DFS(numbers, answer, target, 0, 0);

	return answer;
}

 

생각해 볼 다른사람 코드

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> 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();

728x90