본문 바로가기
Algorithm/프로그래머스

[프로그래머스]깊이/너비 우선 탐색(DFS/BFS) : 타겟 넘버 (level 2)(java, c++)

by HBGB 2019. 11. 4.

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이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘

programmers.co.kr

 

java 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class Solution {
 
    int answer;
 
    public int solution(int[] numbers, int target) {
        boolean[] flag = new boolean[numbers.length];
        answer = 0;
        
        // 배열의 멱집합 구하기
        powerSet(numbers, flag, 0, target);
        return answer;
    }
 
    public void powerSet(int[] numbers, boolean[] flag, int depth, int target) {
 
        if (depth == numbers.length) {
            int iSum = 0;
            
            // flag값이 true면 + , flase 면 -
            for (int i = 0; i < depth; i++) {
                if (flag[i] == true) {
                    iSum += numbers[i];
                } else {
                    iSum -= numbers[i];
                }
            }
 
            if (iSum == target) {
                answer++;
            }
            return;
        }
 
        flag[depth] = true;
        powerSet(numbers, flag, depth + 1, target);
 
        flag[depth] = false;
        powerSet(numbers, flag, depth + 1, target); 
    }
}
Colored by Color Scripter
 

c++ 코드

#include <vector>

using namespace std;

int cnt;

void dfs(const vector<int> &numbers, int sum, int i, const int &target)
{
    if (i == numbers.size())
    {
        if (sum == target)
        {
            cnt++;
        }
        return ;
    }

    dfs(numbers, sum + numbers[i], i + 1, target);
    
    dfs(numbers, sum - numbers[i], i + 1, target);
}

int solution(vector<int> numbers, int target) {
    
    dfs(numbers, 0, 0, target);

    return cnt;
}

 

java코드 

멱집합 구하기를 이용해서 풀었다

(멱집합 구하는데 쓰인 알고리즘을 "백트랙킹"이라고 하는 것 같다.) 

백트랙킹 공부하면 다시 업뎃하겠다...

 

(20200508 추가)

c++코드

DFS로 풀었다.

예전에 풀었던 java코드랑 비교하니, c++코드가 훨씬 깔끔하다.

 

 

 

댓글