자료구조

[프로그래머스/java] 타겟 넘버

pobii 2025. 3. 18. 22:41

 

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

 


 

문제풀이1

아이디어

- 모든 경우의 수를 살피기 위해 BFS 방식을 사용한다

- 저장구조는 큐를 사용한다

- 큐에 인덱스와 값을 저장하여 현 단계와 현재까지의 합을 저장한다

코드

import java.util.*;

class Solution {
    public int solution(int[] numbers, int target) {
        int answer = 0;
        Queue<int[]> queue = new LinkedList<>();
        queue.add(new int[]{0, 0});
        
        while (!queue.isEmpty()) {
            int[] curr = queue.poll();
            int sum = curr[0];
            int index = curr[1];
            
            if (index == numbers.length){
                if (sum == target) answer++;
            } else {
                queue.add(new int[]{sum+numbers[index], index+1});
                queue.add(new int[]{sum-numbers[index], index+1});  
            } 
        }
        return answer;
    }
}

 

 

시간복잡도

모든 경우의 수를 탐색하므로 O(2^numbers의 길이) -> O(2^n)

 


문제풀이2

아이디어

- 모든 경우의 수를 살피기 위해 DFS 방식을 사용한다

- 숫자를 하나씩 추가하면서 현재까지의 합을 저장한다

- 모든 숫자를 사용했을 때, 현재까지의 합 == target이면 answer에 1을 증가시킨다.

코드

class Solution {
    public int solution(int[] numbers, int target) {
        int answer = dfs(numbers, target, 0, 0);
        return answer;
    }
    
    private int dfs(int[] numbers, int target, int index, int sum){
        if (index == numbers.length){
            if (sum == target){
                return 1;
            } else {
                return 0;
            }
        } else {
            return dfs(numbers, target, index+1, sum+numbers[index]) +
            dfs(numbers, target, index+1, sum-numbers[index]);
        }
    }
}

 

시간복잡도

모든 경우의 수를 탐색하므로  O(2^numbers의 길이) -> O(2^n)