알고리즘/프로그래머스 Level2

[프로그래머스,자바] Level2 : 타겟 넘버

류창 2021. 9. 29. 20:05
반응형

문제분석

여러개의 숫자가있는 배열 numbers와 target이 입력으로 주어집니다.

 

목표: numbers의 숫자를 모두활용하여, + - 만으로 target을 만드는 경우의수를 세기 

 

모든 숫자를 사칙연산중 +,-만을 활용하여 target이 나오는경우를 세주면된다.

사칙연산중 2개의 연산만 고려하면되니, 재귀함수를 활용하면 간단하게 풀수있다.

문제풀이

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
class Solution {
    boolean[] visited;
    int cnt=0;
    
    public int solution(int[] numbers, int target) {
        int answer = 0;
        visited=new boolean[numbers.length];
        recursive(numbers,0,target);
        return answer=cnt;
    }
    
    public void recursive(int[] numbers,int idx,int target){
        //재귀 로직
        for(int i=idx;i<numbers.length;i++){
            visited[i]=true;
            recursive(numbers,i+1,target);
            visited[i]=false;
        }
        
        //연산 시작
        int total=0;
        for(int i=0;i<numbers.length;i++){
            if(visited[i]==true){
                total+=numbers[i];
            }
            else{
                total+=numbers[i]*(-1);
            }
        }
        //타겟과 맞는지확인
        if(total==target){
            cnt++;
        }
    }
}
cs

 

전역변수로 boolean배열 visited를 선언한다. 이 배열을 통해, +연산과 -연산 여부를 결정한다.

전역변수로 cnt를 선언한다. 이 cnt는 타겟변수의 도달한 연산을 세준다.

 

recursive()함수를 작성한다. 완전탐색을하기위한, 배열,인덱스,타겟넘버를 입력값으로 지정한다.

 

14~18은 완전탐색을하기위한 재귀로직을 작성하였다.

 

21~29는 visited[i]에따라 더할지, 뺄지를 결정하고 total을 계산한다.

 

total이 target과 일치한다면 갯수를 1개 증가시킨다.

 

반응형