[LeetCode-자바] N_494 Target Sum

0woy·2025년 1월 14일
0

코딩테스트

목록 보기
43/43

📜 문제

  • 숫자가 저장된 배열 (nums)와 목표값 (target)이 주어진다.
  • 배열 내의 모든 숫자를 더하거나 빼서 target을 만들 수 있는 경우의 수 반환

생각하기

처음 문제를 읽고 "내가 이거 풀 수 있나?" 라는 생각이 먼저 듦.
그래서 그냥 배열 끝까지 탐색하고 target 값이 0이 되면 경우의 수 count 올리는 방식으로 접근했다.


🍳 전체 소스 코드 1

class Solution {
        static int count;
    public int findTargetSumWays(int[] nums, int target) {
        count=0;
        dfs(nums, target, 0, 0);
        return count;
    }
      public static void dfs(int [] nums, int target, int idx, int total){
        if(idx == nums.length){
            if(target == total){
                count++;
            }
            return;
        }

        dfs(nums, target, idx+1, total+nums[idx]);
        dfs(nums, target, idx+1, total-nums[idx]);
    }
}
  • count: 경우의 수
  • dfs(): 현재 값을 누적값에 더하거나 빼기

이렇게 배열의 끝까지 도달했을 때 target과 누적값(total)이 같으면 count 1증가

풀리긴 풀리는데 시간복잡도가 외딴섬 로맨틱 -> 넘 오래 걸려유

그렇다면.. 중복탐색을 안하게끔 만들어 주면 되겠다~


🍳 전체 소스 코드 2

class Solution {
    static Map<String,Integer> memo;
    public int findTargetSumWays(int[] nums, int target) {
         memo = new HashMap<>();
        int res =dfs(nums, target, 0,0);
        return res;
    }
      public static int dfs(int [] nums, int target, int idx,int total){
        if(idx == nums.length){
            return target == total?1:0;
        }
        if(memo.containsKey(idx+","+total)){
            return memo.get(idx+","+total);
        }

        int res = dfs(nums, target, idx+1,total+nums[idx])
                + dfs(nums, target, idx+1,total-nums[idx]);

        memo.put(idx+","+total, res);
        return res;
    }
}
  • memo:
    key: 현재idx, 누적값 value: target 도달 여부

이번에는 memo라는 Map을 사용해서 현재 인덱스의 누적값이 memo에 존재하는 경우,
탐색을 진행하지 않고 저장된 value를 반환 하는 코드를 추가했다.

이게 되나?
어차피 우리는 순차적으로 배열을 탐색하기 때문에.. 뒤는 안 봐도 비디오임
못 믿을 수도 있으니 해볼게유

2)에서 인덱스가 3이고 누적값이 1인 경우는 이미 위에서 확인했잖아요?
그래서 4)에서 해당 값을 고대로 사용해가지고 탐색하지 않는 겁니다..


✨ 결과

어려워도.. 냅다 박치기 하면 풀린다..
리팩토링은 일단 풀고 나서 생각하자

0개의 댓글