연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num과 total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.
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()을 통해 연속된 숫자의 배열을 반환해준다.