자료구조 및 알고리즘/JavaScript Practice

JS Practice) 프로그래머스 : 연속된 수의 합

Ryomi 2023. 5. 1. 09:48
728x90
반응형

 

 

연속된 수의 합

문제설명 :

연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.

 

제한 사항

  • 1 ≤ num ≤ 100
  • 0 ≤ total ≤ 1000
  • num개의 연속된 수를 더하여 total이 될 수 없는 테스트 케이스는 없습니다.

 

입출력 예

num total result
3 12 [3, 4, 5]
5 15 [1, 2, 3, 4, 5]
4 14 [2, 3, 4, 5]
5 5 [-1, 0, 1, 2, 3]

 

 

첫번째 접근

: i 부터 1씩 뺀 숫자 num개를 더했을때 total이 나오면 return 하도록 했다. 테스트 케이스는 통과했지만 최종 통과되지 못했다.                                                                                         

function solution(num, total) {
    let sum = 0
    let answer = []
    
    for(let i = 1; i < total; i++){
        for(let j = 0; j < num; j++){
            sum += i - j
            answer.unshift(i-j)
        }
        if(sum === total) return answer
        else {
            sum = 0    
            answer = []
        }
        
    }
}

 

 

두번째 접근

: 문제의 예시를 보니 num이 짝수인 경우와 홀수인 경우에서 규칙이 있었다. num이 짝수인 경우, 예를들어 4인 경우 total/num 의 몫이 answer 배열의 두번째에 위치했고, 홀수인 경우 배열 중앙에 위치했다. 이 규칙을 이용해 문제를 풀었다. 먼저 total/num의 몫을 구했고 몫에 num/2를 더해 max에 할당했다. 그리고 answer 배열의 길이가 num이 될때까지 배열에 넣어주었다. 이때 unshift를 사용한 이유는 answer 배열을 오름차순으로 정렬해야하므로 배열의 앞에 숫자를 넣어주었다. 통과했다. 

function solution(num, total) {
    let quotient = Math.trunc(total/num)
    let answer = []
    let max = quotient + Math.floor(num/2)
    while(answer.length !== num){
        answer.unshift(max)
        max--
    }

    return answer
}

 

 

solution

function solution(num, total) {
    var min = Math.ceil(total/num - Math.floor(num/2));
    var max = Math.floor(total/num + Math.floor(num/2));

    return new Array(max-min+1).fill(0).map((el,i)=>{return i+min;});
}

 

728x90
반응형