[Lv.0] 연속된 수의 합 ****

01수정·2023년 10월 27일
0
post-thumbnail

<입문 100문제> Day 25 - 시뮬레이션, 조건문, 수학

문제



풀이

  • 수학적으로 접근할 머리가 안돼서 반복문 돌며 구하기로 했다.
    1) 시작점은 0
    2) [0~num] 배열 생성 -> 0~num 합 구하기
    3) 1에서 구한 합과 total 이 동일할때까지 while 반복문을 돈다.
    3-1) 1의 합 < total : 시작점++
    3-2) 1의 합 > total : 시작점--
    3-3) 시작점을 조정한 후 [시작점~num] 배열의 합 구하기
    3-4) 3-3의 합이 동일하면 while문을 벗어난다
    4) 3에서 구한 [시작점~num] 배열 반환
function solution(num, total) {
    let start = 0;
    let sum = new Array(num).fill(0).map((a,i) => i).reduce((a,b) => a+b, 0);
    
    while (sum !== total) {
        if (sum < total) {
            start++
        } else {
            start--
        }
        
        sum = new Array(num).fill(0).map((a,i) => i+start).reduce((a,b) => a+b, 0);
    }
    
    return new Array(num).fill(0).map((a,i) => i+start);
}

해답

  • 찾아보니 수학적으로 접근해야 하는 것 같다.
  • total/num => 수열의 평균값 num/2 => 수열의 마지막에서 중앙까지의 등차 계산 ceil와 floor를 활용 수 있는 이유는 등차가 1이기때문
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;});
}
function solution(num, total) {
    const a = (2 * total / num + 1 - num) / 2
    return Array(num).fill().map((_, i) => i + a)
}
profile
새싹 FE 개발자

0개의 댓글