양의 정수 n이 매개변수로 주어질 때,
n이 홀수라면 n 이하의 홀수인 모든 양의 정수의 합을 return 하고
n이 짝수라면 n 이하의 짝수인 모든 양의 정수의 제곱의 합을 return
if (n%2 != 0)
for (int i=1; i<=n; i+=2) answer += i;
else
for (int i=2; i<=n; i+=2) answer += i*i;
return answer;
[Java]
if (n%2 != 0) {
for (int i=1; i<=n; i++) {
if (i%2 != 0) answer += i;
}
} else {
for (int i=2; i<=n; i++) {
if (i%2 == 0) answer += Math.pow(i, 2);
}
}
반복문과 조건문 사용: 명확하고 직관적이지만 다소 비효율적.
두 번째 루프에서 모든 i에 대해 Math.pow(i, 2)를 호출하는 것은 오버헤드가 있을 수 있다.
for(int i = n; i >= 0; i -= 2)
answer += (n % 2 == 0) ? i * i : i;
단일 반복문과 조건 삼항 연산자 사용: 간결하지만 명확성이 떨어질 수 있음.
(n % 2 == 0) 조건이 반복문 안에서 매번 평가되므로 약간의 비효율성이 존재할 수 있다.
if (n % 2 == 1) {
return (n + 1) * (n + 1) / 2 / 2;
} else {
return 4 * n/2 * (n/2 + 1) * (2 * n/2 + 1) / 6;
}
수학적 공식 사용: 매우 효율적이고 간결하지만 가독성과 유지보수성이 떨어질 수 있음.
복잡한 수학적 공식은 실수하기 쉽고, 디버깅이 어려울 수 있다.
- 홀수의 합 공식: (1+n)/2⋅(n/2+1) ---> (n + 1) * (n + 1) / 4
- 짝수 제곱 합 공식: 4⋅m(m+1)(2m+1)/6
if(n%2 == 0) {
return IntStream.rangeClosed(1,n).filter(i->i%2==0).map(i->(int) Math.pow(i,2)).sum();
}
return IntStream.rangeClosed(1,n).filter(i->i%2==1).sum();
스트림 API 사용: 간결하고 가독성이 좋지만 성능과 복잡성에서 약간의 단점이 있음.
스트림 API는 내부적으로 반복문을 사용하기 때문에, 단순 반복문보다 약간의 성능 저하가 있을 수 있다.
- 명확성과 가독성을 중시하는 경우: 반복문과 조건문을 사용하는 방식이 좋습니다.
- 최대 효율성이 필요한 경우: 수학적 공식을 사용하는 방법이 좋습니다.
- 간결성과 선언적 코드를 선호하는 경우: 스트림 API를 사용하는 방식이 좋습니다.
[Python]
if n%2:
return sum(range(1,n+1,2))
return sum([i*i for i in range(2,n+1,2)])