[프로그래머스 | JS] Lv0. 연속된 수의 합

HICHULOG·2023년 7월 11일
0

프로그래머스

목록 보기
14/38
post-thumbnail

연속된 수의 합

📝 문제

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

⛔️ 제한 사항

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

💡 풀이

function solution(num, total) {
    let firstEl = (total/num - num/2 + 1/2);
    let arr = [];
    for(let i=firstEl;;i++){
        arr.push(i)
        if(arr.length===num) break;
    }
    return arr;
}

=> 등차수열의 합 공식을 이용해 연속된 숫자의 첫항을 구한다. 빈 배열에 첫항부터 num 개수만큼 연속된 숫자를 넣어준다. 연속된 숫자를 넣어주는 더 간단한 메서드가 있을 것 같다. 아래 다른 풀이보다 내 풀이의 처리시간이 짧다. 풀이가 짧다고 처리가 빨리되는 것은 아니다. 원리와 구조를 알아야 겠다. 처리시간이 왜 그렇게 나오는지를 알아야 겠다.

여담이지만 '홀짝에 따라 다른 값 반환하기'문제를 통해 등차수열의 합에 대해서 알게 되었고 연속된 숫자를 보자 등차수열로 풀면되겠다고 생각이 들었다. 문제를 풀다보면 전에 풀었던 풀이가 다른 방식으로도 사용될 수 있어서 더더 열심히 문제를 풀고 정리해야겠다는 생각이 들었다.

✅ 다른 풀이

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;});
}

=> total/num(연속된 숫자의 중앙 값) => 수열의 평균값 num/2 => 수열의 마지막에서 중앙까지의 등차 계산 ceil와 floor를 활용 수 있는 이유는 등차가 1이기때문이다.

위 식에서 min값만 구해도 풀이가 가능하다.

function solution(num, total) {
    var min = Math.ceil(total/num - Math.floor(num/2));
    return new Array(num).fill(0).map((el,i)=>{return i+min;});
}
function solution(num, total) {
    const a = (2 * total / num + 1 - num) / 2
    return Array(num).fill().map((_, i) => i + a)
}

=> 내 풀이와 같은 원리인데 메서드를 이용해 간결하게 연속된 숫자를 배열에 넣어 주었다. 생성한 num길이의 배열은 num만큼의 빈 슬롯을 가지는 것으로, 실제 undefined를 채우는 것이 아니다. fill()메서드로 값을 채워주고 map()을 통해 연속된 숫자의 배열을 반환해준다.

🚀 TIL

profile
🚀 Front-end Dev

0개의 댓글