[ 프로그래머스 ] 짝수의 합(JAVA)
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/120831
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제
정수 n
이 주어질 때, n
이하의 짝수를 모두 더한 값을 return 하도록 solution 함수를 작성해주세요.
제한사항
0 < n ≤ 1000
입출력 예
n | result |
10 | 30 |
4 | 6 |
입출력 예 설명
입출력 예 #1
- n이 10이므로 2 + 4 + 6 + 8 + 10 = 30을 return 합니다.
입출력 예 #2
- n이 4이므로 2 + 4 = 6을 return 합니다.
💡내가 푼 방식
class Solution {
public int solution(int n) {
int answer = 0;
for(int i=0; i<=n; i++){
if(i % 2 == 0) {
answer += i;
}
}
return answer;
}
}
- i를 0부터 n까지 하나씩 증가시키면서 반복한다.
- i가 짝수인지 검사를 한다. (%는 나머지 연산자니까, 2로 나눈 나머지가 0이면 짝수!)
- i가 짝수일 경우 그 값을 answer에 더한다.
위와 같이 푼 것이 틀린 방식은 아니지만 제일 기본적인 방식이며 효율적으로 생각하지 못 한 방식이기도 해서, 코드 수를 조금 더 줄이고 효율적인 방법이 없을까 생각하다가 개선된 방식으로도 한번 풀어봤다.
🔥 개선된 방식
class Solution {
public int solution(int n) {
int answer = 0;
for(int i = 2; i <= n; i += 2) {
answer += i;
}
return answer;
}
}
- i = 2 부터 시작
- 어차피 짝수만 더할 거니깐, 0 또는 1부터 검사할 필요가 없다.
- i += 2 씩 증가
- 짝수만 건너뛰면서 반복하니깐 매번 if(i % 2 == 0) 조건을 확인 안 해도 된다.
- 더 빠르고 효율적
- 반복 횟수가 줄어들고, 조건 검사도 없으니 성능적으로 이득이 있다.
개선된 방식도 충분히 효율적이긴 하지만, '이걸 반복문 없이 더 간단하게 못 풀까?'라는 생각이 들어서, 수학적인 공식을 이용한 방법도 추가로 고민해보게 되었다. 실제로 이게 훨씬 간단하고 빠른 방식이었다!
이 방식은 시간 복잡도가 O(1)이기 때문에, 특히 입력값이 커질수록 성능 차이가 더욱 뚜렷하게 나타난다.
📌 수학 공식으로 푸는 방법
int k = n / 2;
int answer = k * (k + 1); // 이게 곧 짝수 합!
✅ 수학 공식으로 푸는 방법(초초초 효율적!)
짝수의 합 : 2 + 4 + 6 + ... + n (단, n이 짝수인 경우)
이걸 일반화하면 짝수는 2 * k
형태니깐 2 + 4 + 6 + ... + 2k = 2*(1 + 2 + 3 + ... + k)
즉, 짝수들의 합 = 2 x (1부터 k까지의 합) 여기서 k = n / 2
🎯 예 : n = 10일 때
짝수들 : 2 + 4 + 6 + 8 + 10
-> k = 10 / 2 = 5
-> 1 + 2 + 3 + 4 + 5 + = 15
-> 짝수의 합 = 2 x 15 = 30
짝수의 합을 수학적으로 이렇게 깔끔하게 구할 수 있다면, '그럼 홀수는 어떻게 구하지? 혹시 이것도 비슷한 방법이 있을까?"라는 궁금증이 생겼다. 그래서 홀수의 합을 구하는 방법도 찾아보게 되었다.
❓ n 이하의 홀수들의 합을 구하는 경우
예를 들어 n = 9일 때 홀수는 1, 3, 5, 7, 9 -> 총 5개 이걸 공식으로 풀면
홀수의 합 공식
홀수 개수 = (n + 1) / 2
홀수의 합 = (홀수 개수)^2
예시
- n = 9일때, 홀수 개수 = (9+1) / 2 = 5
- 홀수의 합 = 5² = 25
- n = 7일 때, 홀수 개수 = (7 + 1) / 2 = 4
- 홀수의 합 = 4² = 16
✅ 자바 코드로 표현하면
int count = (n + 1) / 2;
int answer = count * count;