백엔드 공부를 하면서 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;
}
조건이 참이면 sum에 i를 더합니다.
조건이 거짓이면 아무것도 더하지 않고 다음 숫자로 넘어갑니다.
마지막으로 누적된 값을 출력합니다.
System.out.println(sum);
실행 예시
입력이 아래와 같다고 해보겠습니다.
5
반복문은 1부터 5까지 확인합니다.
| i | 짝수 여부 | 계산 후 sum |
|---|---|---|
| 1 | 아니오 | 0 |
| 2 | 예 | 2 |
| 3 | 아니오 | 2 |
| 4 | 예 | 6 |
| 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 += i는 if문 안에 있어야 합니다.
정리
CodeUp 1259번은 반복문, 조건문, 누적을 함께 연습하기 좋은 문제입니다.
풀이 흐름은 단순합니다.
sum을 0으로 준비합니다.for문으로 1부터n까지 확인합니다.i % 2 == 0으로 짝수인지 검사합니다.- 짝수일 때만
sum += i로 더합니다. - 마지막에
sum을 출력합니다.
1258번이 모든 수를 더하는 문제였다면, 1259번은 조건에 맞는 수만 골라 누적하는 문제입니다. 이 차이를 이해하면 이후에 특정 조건을 만족하는 값만 세거나 더하는 문제를 풀 때도 같은 흐름으로 생각할 수 있습니다.