nums
)와 목표값 (target
)이 주어진다.target
을 만들 수 있는 경우의 수 반환 처음 문제를 읽고 "내가 이거 풀 수 있나?" 라는 생각이 먼저 듦.
그래서 그냥 배열 끝까지 탐색하고 target 값이 0이 되면 경우의 수 count 올리는 방식으로 접근했다.
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증가
풀리긴 풀리는데 시간복잡도가 외딴섬 로맨틱 -> 넘 오래 걸려유
그렇다면.. 중복탐색을 안하게끔 만들어 주면 되겠다~
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)
에서 해당 값을 고대로 사용해가지고 탐색하지 않는 겁니다..
어려워도.. 냅다 박치기 하면 풀린다..
리팩토링은 일단 풀고 나서 생각하자