연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num과 total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.
제한사항
function solution(num, total) {
// 정수 배열의 첫 번째 값 구하기
let sum = (num - 1) * num / 2;
let el = (total - sum) / num;
return Array.from({ length: num }, (_, idx) => el + idx);
}
연속되는 숫자니까... 정수 배열의 첫 번째를 구하면 쉽지 않을까 생각하고 접근했다.
첫 번째 숫자는 모르는 상황에서 다음 인덱스, 다다음 인덱스, ...와의 차이를 더하여
sum
에 할당했다. 이는 1부터 n까지의 정수의 합이 될 것이다. 가우스의 덧셈 공식을 활용해서 (정식 명칭 찾아봄) 구해준다. ➡️ n * (n+1) / 2
첫 번째 원소를 구한다.
total
에서 첫 번째 원소와의 차이의 합(sum
)을 다 빼면 첫 번째 원소를 num
번 만큼 곱해준 값이 될 것이다. 따라서 num
으로 나누어 첫 번째 원소의 값을 구한다.첫 번째 원소부터 연속한 정수의 배열을 구하여 반환한다.
{ length: num}
을 준다.el
부터 1씩 증가한 값으로 채워준다. 인덱스 값을 더해주면 된다. ➡️ 두 번째 인자로 (_, idx) => el + idx)
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;});
}
min
과 max
값을 구한다. 연속된 숫자의 범위를 설정하는 데 사용된다. total/num
)에서 num
의 절반 값을 뺀 후 올림하면 최소값이고, 절반값을 더한 후 내림하면 최대값이다. 이게... 이렇게 되는구나? 이해하기보단 그냥 외울래... 흑흑new Array(max - min + 1)
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)
}
a
를 계산한다.