백엔드 공부를 하면서 CodeUp 기초 문제를 하나씩 풀어보고 있습니다.

이번 글은 CodeUp 1259번 풀이 기록입니다. 문제 원문은 출처 링크에서 확인할 수 있고, 여기서는 제가 어떻게 생각하고 Java 코드로 풀었는지 정리합니다.

이전 글인 CodeUp 1258번 1부터 n까지 합 구하기와 흐름이 비슷합니다. 다만 이번에는 모든 수를 더하는 것이 아니라 짝수만 골라서 더하는 것이 핵심입니다.


문제

정수 n을 입력받습니다.

그리고 1부터 n까지의 수 중에서 짝수만 골라 더한 값을 출력해야 합니다.

예를 들어 n이 5라면 더해야 하는 수는 아래와 같습니다.

2 + 4 = 6

1, 3, 5는 홀수이므로 합계에 넣지 않습니다.


처음 떠오르는 생각

처음에는 1258번처럼 1부터 n까지 모두 반복하면 된다고 생각했습니다.

다만 이번에는 숫자를 바로 더하면 안 됩니다. 현재 숫자가 짝수인지 확인한 뒤, 짝수일 때만 sum에 더해야 합니다.

흐름은 이렇게 볼 수 있습니다.

1 확인 -> 홀수 -> 건너뜀
2 확인 -> 짝수 -> sum에 더함
3 확인 -> 홀수 -> 건너뜀
4 확인 -> 짝수 -> sum에 더함
...
n까지 반복

즉, 필요한 것은 세 가지입니다.

  • for문으로 1부터 n까지 반복합니다.
  • if문으로 짝수인지 확인합니다.
  • 짝수일 때만 sum에 누적합니다.

핵심 아이디어

짝수는 2로 나누었을 때 나머지가 0인 수입니다.

Java에서는 나머지를 구할 때 % 연산자를 사용합니다.

i % 2 == 0

이 조건은 아래처럼 읽을 수 있습니다.

i를 2로 나눈 나머지가 0이면 짝수입니다.

따라서 반복문 안에서 이 조건을 확인하고, 조건이 참일 때만 더하면 됩니다.

if (i % 2 == 0) {
    sum += i;
}

코드

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        int sum = 0;

        for (int i = 1; i <= n; i++) {
            if (i % 2 == 0) {
                sum += i;
            }
        }

        System.out.println(sum);
    }
}

코드 해설

먼저 입력값 n을 받습니다.

Scanner sc = new Scanner(System.in);
int n = sc.nextInt();

n은 확인할 마지막 숫자입니다. n이 10이면 1부터 10까지 검사합니다.

합계를 저장할 변수는 0으로 시작합니다.

int sum = 0;

아직 짝수를 하나도 더하지 않았기 때문에 처음 값은 0입니다.

반복문은 1부터 n까지 진행합니다.

for (int i = 1; i <= n; i++) {
}

반복문 안에서 현재 숫자 i가 짝수인지 확인합니다.

if (i % 2 == 0) {
    sum += i;
}

조건이 참이면 sumi를 더합니다. 조건이 거짓이면 아무것도 더하지 않고 다음 숫자로 넘어갑니다.

마지막으로 누적된 값을 출력합니다.

System.out.println(sum);

실행 예시

입력이 아래와 같다고 해보겠습니다.

5

반복문은 1부터 5까지 확인합니다.

i짝수 여부계산 후 sum
1아니오0
22
3아니오2
46
5아니오6

출력은 다음과 같습니다.

6

다른 풀이 생각

짝수만 더하면 되므로 처음부터 i를 2씩 증가시키는 방법도 있습니다.

for (int i = 2; i <= n; i += 2) {
    sum += i;
}

이 방식은 홀수를 아예 확인하지 않습니다. 그래서 조건문 없이도 풀 수 있습니다.

다만 처음 연습할 때는 if (i % 2 == 0) 방식이 더 직관적입니다. 반복문과 조건문을 함께 연습하기 좋기 때문입니다.


복잡도

기본 풀이에서는 반복문이 1부터 n까지 실행됩니다.

그래서 시간복잡도는 O(n)입니다.

추가로 사용하는 변수는 n, sum, i 정도입니다. 입력 크기에 따라 배열을 새로 만들지 않습니다.

공간복잡도는 O(1)입니다.


실수하기 쉬운 부분

짝수 조건을 쓸 때 ===를 헷갈리면 안 됩니다.

if (i % 2 == 0) {
}

==는 두 값이 같은지 비교할 때 사용합니다. 반면 =는 값을 변수에 넣을 때 사용합니다.

또 하나는 sum += i의 위치입니다. 아래처럼 조건문 밖에 두면 모든 숫자가 더해집니다.

for (int i = 1; i <= n; i++) {
    if (i % 2 == 0) {
    }

    sum += i;
}

이 문제에서는 짝수만 더해야 하므로 sum += iif문 안에 있어야 합니다.


정리

CodeUp 1259번은 반복문, 조건문, 누적을 함께 연습하기 좋은 문제입니다.

풀이 흐름은 단순합니다.

  • sum을 0으로 준비합니다.
  • for문으로 1부터 n까지 확인합니다.
  • i % 2 == 0으로 짝수인지 검사합니다.
  • 짝수일 때만 sum += i로 더합니다.
  • 마지막에 sum을 출력합니다.

1258번이 모든 수를 더하는 문제였다면, 1259번은 조건에 맞는 수만 골라 누적하는 문제입니다. 이 차이를 이해하면 이후에 특정 조건을 만족하는 값만 세거나 더하는 문제를 풀 때도 같은 흐름으로 생각할 수 있습니다.