| 문제
정수 n이 주어질 때, n이하의 짝수를 모두 더한 값을
return 하도록 solution 함수를 작성해 주세요.
| 제한 사항
- 0 < n ≤ 1,000
| 입출력 예
n | result |
10 | 30 |
4 | 6 |
| 힌트
홀수와 짝수를 판단하는 기준이 2로 나눴을 때 나머지라는 사실을 기억하세요.
지금 머릿속에 그려지는 그대로 풀어가시면 됩니다.
연속한 두 항의 차가 일정한 수열을 뜻하는 등차수열을 활용할 수도 있습니다.
| 풀이 1
우리가 아는 자연수중에서 가장 작은 짝수 2에서부터
주어진 숫자 n까지 2의 배수 즉, 짝수들을 하나씩 더해줍니다.
public int solution01(int n) {
int answer = 0;
for(int i = 2 ; i <= n ; i+= 2){
answer += i;
}
return answer;
}
| 풀이 2
좀 더 그럴싸한 방법을 찾는 분들께 제안드리는 방식입니다.
수학시간에 배운 수식을 활용했습니다.
특정 숫자 n이 짝수이거나 홀수일 때 해당 숫자까지 나타나는 짝수를 구하는 수식이지요.
아래 해설에 등차수열에 대해 자세히 설명해 두었습니다.
public int solution02(int n) {
int answer = 0;
if(n%2 == 0) answer = (n/2)*(2+n)/2;
else answer = ((n-1)/2) * (2+(n-1)) /2;
return answer;
}
| 해설
테스트 1과 테스트 2를 제외하고 모든 테스트의 소요 시간이 같았습니다.
등차수열로 푸는 방법이 1과 2에서 더 빠르긴 했어요.
그렇기 때문에 등차수열을 모르고 넘어갈 수는 없습니다.
더하고자 하는 수가 모두 짝수이므로 연속한 두 항의 차가 일정한 수열(등차수열)입니다.
등차수열을 구성하기 위해서는 총 3개의 데이터가 필요합니다.
전체 더하기 대상이 되는 항의 개수, 첫 번째 항, 마지막 항을 알아야 해요.
(항의 개수) *(첫 번째 항 + 마지막 항)/2
주어진 숫자가 짝수이냐 홀수이냐에 따라 3개의 데이터가 달라집니다.
첫 번째 항은 짝수를 구하는 것이므로 2로 같지만,
특정 숫자가 홀수이면 항의 개수는 n/2, 짝수이면 n에서 1일 뺀 다음 나누기 2를 해야 하죠.
마지막항 또한 짝수는 n을 쓰면 되지만 홀수는 n에서 1을 빼야 짝수인 항이 마지막 항이 됩니다.
아래 수식을 자세하게 작성해 두었으니 참고하시기 바랍니다.
* 주어진 숫자 n이 짝수인 경우
1. 항의 개수 : (n/2)
2. 첫 번째 항 : 2
3. 마지막 항 : n
4. 수식 : (n/2)*(2+n) / 2
* 주어진 숫자 n이 홀수인 경우
1. 항의 개수 : (n-1)/2
2. 첫 번째 항 : 2
3. 마지막 항 : (n-1)
4. 수식 : ((n-1)/2) * (2+(n-1)) / 2
'개발 > 개발 공부' 카테고리의 다른 글
[프로그래머스] 코딩테스트 입문 : 외계행성의 나이 (2) | 2024.09.19 |
---|---|
[프로그래머스] 코딩테스트 입문 : 배열 자르기 (0) | 2024.09.12 |
[프로그래머스] 코딩테스트 입문 : 양꼬치 (0) | 2024.09.09 |
[프로그래머스] 코딩테스트 입문 : 각도기 (0) | 2024.09.06 |
[프로그래머스] 코딩테스트 입문 : 특정 문자 제거하기 (0) | 2024.09.05 |
댓글