본문 바로가기
개발/개발 공부

[프로그래머스] 코딩테스트 입문 : 짝수의 합

by 하모예 2024. 9. 10.

| 문제

정수 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

댓글