[JavaScript][Programmers] 타겟 넘버

조준형·2021년 7월 4일
0

Algorithm

목록 보기
12/142
post-thumbnail

🔎 타겟 넘버

❓ 문제링크

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

📄 제출 코드

function solution(numbers, target) {
    
    dfs(numbers, target, numbers[0], 0);
    dfs(numbers, target, -1 * numbers[0], 0);
    return answers;
}

let answers = 0;
function dfs(nums, target, sum, depth) {
    if (depth == nums.length-1) {
        if (sum == target) {
            answers += 1;
        }
        return answers;
    }
    dfs(nums, target, sum + nums[depth + 1], depth + 1);
    dfs(nums, target, sum - nums[depth + 1], depth + 1);
}

시작이 +인경우와 시작이 -인경우로 dfs를 돕니다.
가져가는 값들은 (numbers배열, 시작값, 깊이, target)
깊이가 배열을 다돌았을 때, num이 목표값가 같다면, 한가지 방법을 찾았으니 answers에 +1
다 돌지 않았다면 깊이를+1해서 +인경우 -인경우 두 가지로 한번 더 돕니다.

처음에 시작이 +인경우 -인경우를 나누지 않아 오답이 나옴.

🎲 다른 풀이

📄 작성 코드

function solution(numbers,target) {
    function func(numbers, r){
        if(numbers.length > 0){
            var tmp = numbers.pop() + r;
            return func(numbers.slice(), tmp) + func(numbers.slice(), -tmp);
        }
        else { return r==target ? 1:0;}
    }
    return func(numbers,0);
}

👉 slice()

slice를 이용하여 좀 더 간단하게 작성한 코드다.
(slice()에서 ()안에 아무값도 없으면 전체 배열을 출력함.)
numbers배열과 처음 합 0을 시작으로 dfs를 도는데
numbers.length가 양수인 경우, numbers를 pop한거에 여태까지의 합을 더한다.
그리고,
남은 배열들과 합들을 가지고 다시 한번 func를 돈다.

내 코드의 경우 dfs()를 두번씩 도는데 이걸 어떻게 하면 줄일수 있을 지 고민하였었다.
그러다 위의 코드를 발견하였고,

if(numbers.length > 0){
  var tmp = numbers.pop() + r;
  return func(numbers.slice(), tmp) + func(numbers.slice(), -tmp);
}

이부분에서 되게 인상깊었다.
이게 어떻게 + - 모두 도는거지라고 처음에 이해가 안됐는데 양수로 뽑히고, +tmp, -tmp로 처음에 갈리고 나서 음수인경우 +tmp가 음수가되고 -tmp가 다시 양수가되서 모든 경우를 다돌 수 있다.

그렇게 numbers가 다 pop했을 때 (모든 배열의수를 다 사용했을 때) target이면 1을 return하고 하나씩 빠져나오면서 r==target인경우 아닌경우를 모두 더해서 답이 도출된다.
(코드짜신분 개똑똑하넹,,)

📘 참고

정답 게시판 - 어린양님 코드

profile
깃허브 : github.com/JuneHyung

0개의 댓글