[Programmers] (고득점KIT) DFS & BFS - 타겟 넘버

Sierra·2022년 1월 30일
0
post-thumbnail

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

문제 설명

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

입출력 예

numberstargetreturn
[1, 1, 1, 1, 1]35
[4, 1, 2, 1]42

Solution

#include <string>
#include <vector>

using namespace std;

int answer = 0;

void DFS(vector<int> numbers, int target, int sum, int count){
    if(numbers.size() == count){
        if(sum == target) answer++;
        return;
    }
    DFS(numbers, target, sum + numbers[count], count+1);
    DFS(numbers, target, sum - numbers[count], count+1);
}

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

정해진 수 안에서 얼마나 타겟넘버를 만들어 낼 수 있느냐를 찾는 문제다.
예를 들어 4,1,2,1에서는 4를 만들기 위해 4 - 1 + 2 - 1을 할 수 있고 4 + 1 - 2 + 1을 할 수도 있다. 그래서 총 2개의 방법이 존재한다고 할 수 있다.
이러한 것들을 사람이 생각해 내서 찾아낼 수 있겠지만, 꼭 그럴 필요는 없다.

int answer = 0;

void DFS(vector<int> numbers, int target, int sum, int count){
    if(numbers.size() == count){
        if(sum == target) answer++;
        return;
    }
    DFS(numbers, target, sum + numbers[count], count+1);
    DFS(numbers, target, sum - numbers[count], count+1);
}

count는 그 값을 더하거나 뺀 횟수를 저장하는 변수다. 어쨌든 모든 수를 다 써야하니까 이러한 변수가 필요하다. 일단 무지성으로 모든 값들을 더하는 경우와 뺀 경우를 모두 계산해보는 것이다. 모든 경우의 수에 대해 계산하는 데 다양한 방법이 있겠지만 DFS를 쓴 이유는 다음과 같다.
모든 경우의 수를 Tree 형태로 나타 낼 수 있다. 즉 이러한 Tree들을 하나 하나 Search하는 느낌으로 탐색한다면 훨씬 좋은 결과를 나타낼 수 있다. 무작정 for문 돌리고 뻘짓을 해도 상관은 없다만 코드가 훨씬 복잡해질 것이다.
그래서 모든 경우의 수에 대해 각각 DFS를 진행하고 Leaf Node에 도달하였을 때 (count == numbers.size() 일 때) 결과를 확인하는 것이다.

탐색하는 기법들은 다양하게 있지만 어떤 과정으로 경우에 다다르는 지를 확인해본다면 조금 더 고급 진 탐색법을 고민해볼 수 있을 것이다.

profile
블로그 이전합니다 : https://swj-techblog.vercel.app/

0개의 댓글