문제 설명
연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num과 total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.
제한사항
- 1 ≤ num ≤ 100
- 0 ≤ total ≤ 1000
- num개의 연속된 수를 더하여 total이 될 수 없는 테스트 케이스는 없습니다.
입출력 예 설명
내가 생각한 알고리즘은 다음과 같다.
먼저 연속된 여러 개의 정수 중 첫 번째 숫자를 구한다.
// 연속된 여러 개의 정수의 합 = total
(x) + (x+1) + (x+2) ... + (x+num) = total
// num 으로 묶기
(num * x) + (num * (num - 1)/2) = total
// 양변을 num 으로 나눠주기
x + (num-1)/2 = total / num
// 첫 번째 수 x (내 코드에서는 n1 값) 구하기
x = total / num - (num-1) / 2
최종으로 for 문에서 answer 배열을 구한다.
function solution(num, total) {
let answer = [];
const n1 = total / num - (num - 1) / 2; // 연속된 세 개의 정수 중 첫 번째 숫자
for (let i = 0; i < num; i++) {
answer.push(n1 + i); // n1부터 num개 만큼 배열에 추가
}
return answer;
}
// 출처: 프로그래머스 Apensia 님 풀이
function solution(num, total) {
const a = (2 * total / num + 1 - num) / 2
return Array(num).fill().map((_, i) => i + a)
}
// return 부분 해석
// Array(num) >> [ <3 empty items> ]
// Array(num).fill() >> [ undefined, undefined, undefined ]
// 출처: 프로그래머스 J 님 풀이
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;});
}
// Math.ceil(x) >> x 보다 크거나 같은 가장 작은 정수
// Math.floor(x) >> x 보다 작거나 같은 가장 큰 정수