Problem Solving/프로그래머스

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

세고래 2022. 12. 14. 01:42

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


1) 풀이

이런 문제 은근 많이 풀어봤다고 생각했는데 생각보다 시간이 오래 걸렸던 문제,,

시험기간 끝나고 처음 푸는 알고리즘 문제라 그런지 많이 버벅였다,,

 

일단 메인 아이디어는, numbers 라는 배열을 따라가면서 그 요소 하나하나를 더한 경우와 뺀 경우 두가지를 다른 배열에 넣고 그 다음 요소로 넘어가 방금 넣어주었던 요소들에 더하고 빼고... 이렇게 반복하는 것!
요소들을 더하고 빼고 넣고 또 그다음 번에 확인하는 것까진 쉬웠는데, 현재 내가 살펴보고 있는 요소가 numbers의 어느 인덱스 요소까지 더했는지를 구분할 수가 없었다!

그래서 생각한 방법은, 애초에 더하고 뺀 요소들을 어떤 배열에 넣고, 그것을 또 다른 배열에 넣어서 2차원 배열을 만들어주면, 자연스럽게 인덱스를 따라서 더해주는 것이 가능! 

(ex. numbers[0] 을 []에 넣고, arr 라는 배열에 [numbers[0]] 이라는 배열 자체를 집어넣어주면, arr[0] 의 길이 만큼 탐색하면서 numbers[0+1] 을 더한 것과 뺀 것을 []에 또 넣어주고, 그것을 arr에 집어넣으면 arr[1]로 들어가고 arr[1]의 길이만큼 탐색하면서 그 요소들 각각에 numbers[1+1]을 더하고 빼고...)

 

그렇게 타겟넘버와 일치하는 것만 answer++ 해주면 되는데, 이 문제에서 유의할 점 두가지가 있다

 

1. 타겟넘버는 numbers의 모든 숫자를 사용한 값과 같아야 함

2. 처음에 numbers[0]이 양수인 경우와 음수인 경우가 있음

 

요 두가지는 내가 실수했던 부분이기도 한데, 우선 2번의 경우에는 numbers의 첫요소, 즉 numbers[0]은 아무것도 더하지 않고 arr 에 배열형태로 넣어야, 각 인덱스에 적절하게 더하고 빼줄 수 있는데! 이 경우에 타겟 넘버를 만들때 numbers[0]이 음수로 들어가 타겟넘버를 형성하는 경우가 있으므로 -numbers[0]까지 함께 넣어주어야 한다..! 이렇게 해야 다른 배열들과 똑같이 더하고 빼준 효과를 낼 수 있다!

그리고 1번은, 처음에는 중첩 반복문 안에서, 현재 보고 있는 값이 target과 같은 경우 answer를 늘려주도록 했는데 그렇게 하면 numbers의 모든 요소를 아직 거치지 않았는데, 도중에 target 넘버가 돼서 answer를 늘려주는 경우가 있다..! 타겟넘버 자체가 주어진 numbers의 모든 요소로 만들어질 수 있는 경우를 묻는 것이다 보니 반복문을 따로 빼주어 arr의 마지막 인덱스의 배열을 탐색하면서 살펴보도록 했다

2) 최종 소스코드
function solution(numbers, target) {
    let answer=0;
    const arr=[];
    arr.push([numbers[0],-numbers[0]]);
    for(let i=0;i<numbers.length-1;i++){
        let innerArr=[];
        for(let k=0;k<arr[i].length;k++){
            innerArr.push(arr[i][k]+numbers[i+1]);
            innerArr.push(arr[i][k]-numbers[i+1]);   
        }
        arr.push(innerArr);
    }
    for(let i=0;i<arr[numbers.length-1].length;i++){
        if(arr[numbers.length-1][i]===target) answer++;
    }

    return answer;
}

 

728x90