Finn은 요즘 수학공부에 빠져 있습니다. 수학 공부를 하던 Finn은 자연수 n을 연속한 자연수들로 표현 하는 방법이 여러개라는 사실을 알게 되었습니다. 예를들어 15는 다음과 같이 4가지로 표현 할 수 있습니다.
1 + 2 + 3 + 4 + 5 = 15
4 + 5 + 6 = 15
7 + 8 = 15
15 = 15
자연수 n이 매개변수로 주어질 때, 연속된 자연수들로 n을 표현하는 방법의 수를 return하는 solution를 완성해주세요.
n은 10,000 이하의 자연수 입니다.
n의 절반 값 이상 부터 시작해서 연속된 수를 더하면
무조건 n보다 크기 때문에 시작 수의 최대값은 n의 절반 값으로 한다.시작 값부터 1씩 증가시켜가며 연속된 수를 더하다가
누적 합 값이 n 이상인 경우 n이랑 같으면 answer 값을 1증가시키고
n 보다 크다면 중단한다.
function solution(n) {
var answer = 1;
for(let i = 1; i <= Math.floor(n/2); i++){
let sum = i;
for(let k = i+1; k <= Math.floor(n/2)+1; k++){
sum += k;
if(sum >= n) {
if(sum === n) answer++;
break;
}
}
}
return answer;
}
홀수의 경우, 약수는 홀수 밖에 안나옴.
15의 약수는 1,3,5, 15.
약수를 이용해서 연속된 수의 합이 15가 나오도록 할 수도 있음.
15=1+2+3+4+5 (중간값 3) 3x5 /
15=4+5+6 (중간값 5) 5x3 /
15=7+8 (연속된 수)
7+8 - 홀수인 경우 무조건 가능. /
15=15 /중간값이 3인 경우,
중간값이 5인 경우,
연속된 수(7, 8),
15(n) 해서 4개인데,
이게 공교롭게 홀수의 약수 수와 같음.
그리고 짝수의 경우는 홀수의 연장선이라고 보면 됨.n=30인 경우, 30의 약수는 1, 2, 3, 5, 6, 10, 15, 30임.
30=4 + 5 + 6 + 7 + 8 (중간값 3의 연장) 2x3x5 /
30=9 + 10 + 11 (중간값 5의 연장) 2x5x3 /
30=6+7+8+9 (연속된 두 수의 연장) 2x(7+8) /
30=30 /결과적으로 n의 홀수 약수 개수만 구해도 답이랑 같다.
function expressions(num) {
var answer = 0;
for (var i = 1; i <= num; i++) {
if (num % i == 0 && i % 2 == 1)
answer++
}
return answer;
}
다른 사람의 풀이를 보고 깜짝놀랬다.
저런 수학적 감각은 재능인건가..