Finn은 요즘 수학공부에 빠져 있습니다. 수학 공부를 하던 Finn은 자연수 n을 연속한 자연수들로 표현 하는 방법이 여러개라는 사실을 알게 되었습니다. 예를들어 15는 다음과 같이 4가지로 표현 할 수 있습니다.
자연수 n이 매개변수로 주어질 때, 연속된 자연수들로 n을 표현하는 방법의 수를 return하는 solution를 완성해주세요.
정확성 테스트에서는 처음부터 통과됐지만 효율성 테스트에서 자꾸 실패했던 코드였다.
function solution(n) {
let result = 1;
for (let i = 1; i <= Math.floor(n / 2); i++) {
let num = i;
for (let j = i + 1; j <= Math.ceil(n / 2); j++) {
num += j;
if (num === n) {
result++;
} else if (num > n) {
break;
}
}
}
return result;
}
반복문을 두 번 돌려서 답을 얻어낸 방식이었다.
이 경우 Math로 계산을 두 번이나 해줘야하기도 하고, 두번째 반복문을 for문으로 돌리는게 살짝 애매한 지점(j의 조건을 정해주는 부분에서)이 있기도 해서 while문으로 변경했다.
function solution(n) {
let result = 1;
for (let i = 1; i <= Math.floor(n / 2); i++) {
let num = i;
let j = i + 1;
while (num < n) {
num += j;
if (num === n) {
result++;
break;
} else if (num > n) {
break;
}
j++;
}
}
return result;
}
이 방식을 사용해도 효율성에서 문제가 생기기에, Math.floor로 계산해주는 부분을 따로 변수로 빼는 방식을 사용해보았다.
function solution(n) {
let result = 1;
const floorNum = Math.floor(n / 2);
for (let i = 1; i <= floorNum; i++) {
let num = i;
let j = i + 1;
while (num < n) {
num += j;
if (num === n) {
result++;
break;
} else if (num > n) {
break;
}
j++;
}
}
return result;
}
이렇게 변수로 만들어 해당 변수를 조건문에 넣어주니 문제가 해결되었다.