BretueForce로 접근하면 효율성 문제를 통과하지 못한다. (n/2)개를 순회한다 하여도 1, 1+2, 1+2+3, ...., 2, 2+3, 2+3+4, ... k, k+1, k+2,.... 의 경우를 계산하여야 하므로 O(n^2)가 나올 것이다.
또한 위의 방법은 다른 블로그에 이미 많이 존재하기 때문에 넘어가도록 함.
연속되는 자연수의 개수를 i라 하자.
n을 i로 나눴을 때 나오는 중간값 mid를 바탕으로 mid에 연속한 i개의 자연수들의 합이 n과 같으면 n을 i개의 자연수로 표현할 수 있다.
function solution(n) {
if (n === 1) return 1; // 15번 n === 1일 때
let count = 0;
for (let i = 1; i <= Math.ceil(n / 2); i += 2) {
const mid = n / i;
const k = (i - 1) / 2;
if (n % i !== 0) continue;
if (mid - k <= 0) continue;
if ((2 * k + 1) * mid === n) {
count += 1;
}
}
for (let i = 2; i <= Math.ceil(n / 2); i += 2) {
const mid = n / i;
const k = (i - 2) / 2;
if ((n * 10) / i !== Math.floor(n / i) * 10 + 5) continue;
if (Math.floor(n / i) - k <= 0) continue;
if ((k + 1) * 2 * mid === n) {
count += 1;
}
}
return count;
}