짝수 합, 배열 평균값 풀이
학습 목표
- for문 기본 문법(초기값/조건/증가값)을 정확하게 쓰기
- for-each 문법과 일반 for문의 차이 구분하기
- 정수 나눗셈에서 소수점이 버려지는 문제와 캐스팅으로 해결하는 법 익히기
개념 구조
| for문 3요소 | 초기값; 조건; 증가값 — 셋 다 세미콜론으로 구분 |
| for-each | 인덱스 없이 배열/리스트 값을 순서대로 꺼내 쓰는 반복문 |
| 정수 나눗셈 | int / int는 결과도 int — 소수점 버림 |
| (double) 캐스팅 | 연산 전에 피연산자를 실수로 바꿔서 소수점을 살림 |
| += 누적 | a += b는 a = a + b와 동일, 반복마다 누적 |
내용 정리
1. n 이하 짝수 합 구하기
처음 시도한 코드는 문법 자체가 틀려 있었다.
n % 2 == 0 -> en; // Java 문법 아님
for(0<n, n=<1000){ ... } // for문 구조가 아예 안 맞음
for문은 for(초기값; 조건; 증가값) 형태로 세 부분을 세미콜론으로 구분해야 한다. 콤마나 부등호 위치가 다르면 컴파일 자체가 안 된다.
기본형으로 다시 짠 버전:
int sum = 0;
for (int i = 1; i <= n; i++) {
if (i % 2 == 0) {
sum += i;
}
}
return sum;
i를 1부터 n까지 1씩 올리면서, 짝수일 때만 sum에 더한다.
그런데 직접 더 짧은 풀이를 떠올렸다.
int answer = 0;
for (int i = 2; i <= n; i += 2) {
answer += i;
}
return answer;
처음부터 2씩 건너뛰면서 도니까 if문으로 짝수를 가려낼 필요가 없어진다. 시작값을 2로 잡고 증가값을 2로 주면 2, 4, 6, 8... 짝수만 그대로 순회하게 된다. 같은 결과를 내지만 분기 처리 자체가 빠지니 더 효율적인 풀이다.
answer += i는 answer = answer + i와 같다. 매 반복마다 이전까지 쌓인 값에 새 i를 더해서 다시 저장하는 식으로, n=8 기준 흐름은 이렇다.
| 1 | 2 | 0 + 2 = 2 |
| 2 | 4 | 2 + 4 = 6 |
| 3 | 6 | 6 + 6 = 12 |
| 4 | 8 | 12 + 8 = 20 |
2. 배열의 평균값 구하기
배열 원소를 합산해서 길이로 나누는 문제인데, 두 가지를 새로 정리했다.
for-each 문법
// 일반 for문 - 인덱스 필요
for (int i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
// for-each - 인덱스 없이 값만 순회
for (int n : numbers) {
sum += n;
}
배열 안 값을 순서대로 꺼내기만 하면 되는 상황이라 인덱스가 필요 없다. 이럴 때는 for-each가 코드도 짧고 의도도 명확하다.
처음 짠 코드에서 변수명을 빼먹는 실수가 있었다.
for(int : numbers){ // 꺼낸 값을 담을 변수 이름이 없음
int 뒤에 받을 변수명(i 등)이 꼭 있어야 한다.
정수 나눗셈과 캐스팅
자바에서 int / int는 결과도 int로 떨어진다. 소수점은 버려진다.
int sum = 7, length = 2;
sum / length; // 3 (소수점 버려짐)
(double) sum / length; // 3.5
(double)을 sum 앞에 붙이면 그 순간 sum이 실수로 바뀌고, 나눗셈 전체가 실수 연산으로 처리된다. sum을 캐스팅하든 length를 캐스팅하든 결과는 같다.
(double) sum / numbers.length // sum을 실수로
sum / (double) numbers.length // length를 실수로
최종 코드:
double answer = 0;
int sum = 0;
for (int i : numbers) {
sum += i;
}
answer = sum / (double) numbers.length;
return answer;
학습 메모
짝수 합 문제는 처음에 for문 문법을 손에 익히기 전이라 콤마와 세미콜론을 헷갈렸다. 한 번 기본형을 익히고 나니 "시작-조건-증가"라는 틀이 머리에 박혔고, 그 틀 안에서 증가값만 바꿔도 로직이 달라진다는 걸 직접 체감했다. if문으로 거를지, 증가값 자체를 조정해서 걸러낼 필요가 없게 만들지를 선택할 수 있다는 게 새로웠다.
평균값 문제에서는 캐스팅 위치가 sum이든 length든 상관없다는 걸 확인한 게 컸다. "어디에 (double)을 붙여야 하나" 고민했는데, 핵심은 나눗셈에 들어가는 두 값 중 하나라도 실수면 연산 전체가 실수로 처리된다는 원리였다.
핵심 요약
| 짝수 합 (기본형) | for(int i=1; i<=n; i++) + if(i%2==0) |
| 짝수 합 (개선형) | for(int i=2; i<=n; i+=2) — if문 없이 증가값으로 필터링 |
| 배열 평균 | for-each로 인덱스 없이 순회 |
| 정수 나눗셈 | int / int는 소수점 버림 → (double) 캐스팅 필요 |
| 캐스팅 위치 | sum, length 중 어디에 붙여도 결과는 동일 |
'Camp > 과제' 카테고리의 다른 글
| [계산기 과제 2차] 트러블슈팅 (0) | 2026.06.23 |
|---|---|
| [Java] 계산기 과제 Lv.2 트러블 슈팅- 클래스 분리가 왜 이렇게 헷갈렸나 (0) | 2026.06.19 |
| Camp/과제[TIL] CH2 Java 계산기 과제 Lv.2 (트러블 슈팅) (0) | 2026.06.16 |
| [TIL] CH2 Java 계산기 과제 again (트러블 슈팅) (0) | 2026.06.15 |
| [TIL] CH2 Java 계산기 과제 (트러블 슈팅) (0) | 2026.06.12 |