[Lv 2] 숫자의 표현
📄 문제
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 이하의 자연수 입니다.
🙋♀️ 나의 풀이 1
function solution(n) {
let answer = 1;
let acc = 0;
for (let i = 1; i <= n / 2; i++) {
for (let j = i; j <= n; j++) {
acc += j;
if (acc > n) break;
if (acc == n) {
answer++;
acc = 0;
break;
}
}
acc = 0;
}
return answer;
}
처음에 for문을 돌려 연속된 수의 합을 구했는데 정확성 테스트는 통과했지만 효율성 테스트에서 모두 막혔습니다.
어떻게든 넘어가려고 if문에 i 조건까지 수정했는데 통과할 수 없어 풀이 과정 자체에 대해 다시 생각했습니다.
🙋♀️ 나의 풀이 2
function solution(n) {
let answer = 0;
for (let i = 1; i <= n; i++) {
if (n % i === 0 && i % 2 === 1) answer++;
}
return answer;
}
연속된 수의 합을 구하는 방법을 찾던 중 다음과 같은 방법을 찾았습니다.
자연수의 소수 중 홀수의 개수는 연속된 자연수의 합이 나올 수 있는 개수와 같다.
예를 들어,
15의 약수는 [1, 3, 5, 15]입니다.
- 1의 경우, 연속하는 1개의 자연수로 표현 가능 => 15
- 3의 경우, 연속하는 3개의 자연수로 표현 가능 => 3+4+5
- 5의 경우, 연속하는 5개의 자연수로 표현 가능 => 1+2+3+4+5
- 15의 경우, 모든 홀수는 n과 n+1로 표현가능 => 7+8
이 풀이에서는 공식을 사용했기 때문에 for문이 한번만 돌아가 효율성 테스트를 모두 통과할 수 있었습니다.
다른 문제보다 수학적 지식이 요구되었던 문제였던것 같은데 정답률(73%)이 높네요.
원래 수학은 졸업하면 까먹는건데…
Leave a comment