Camp/과제

[Java] 코드카타 트러블 슈팅

taeri7204 2026. 6. 17. 21:28

짝수 합, 배열 평균값 풀이

학습 목표

  • for문 기본 문법(초기값/조건/증가값)을 정확하게 쓰기
  • for-each 문법과 일반 for문의 차이 구분하기
  • 정수 나눗셈에서 소수점이 버려지는 문제와 캐스팅으로 해결하는 법 익히기

개념 구조

키워드한 줄 정리
for문 3요소 초기값; 조건; 증가값 — 셋 다 세미콜론으로 구분
for-each 인덱스 없이 배열/리스트 값을 순서대로 꺼내 쓰는 반복문
정수 나눗셈 int / int는 결과도 int — 소수점 버림
(double) 캐스팅 연산 전에 피연산자를 실수로 바꿔서 소수점을 살림
+= 누적 a += b는 a = a + b와 동일, 반복마다 누적

내용 정리

1. n 이하 짝수 합 구하기

처음 시도한 코드는 문법 자체가 틀려 있었다.

 
 
java
n % 2 == 0 -> en;          // Java 문법 아님
for(0<n, n=<1000){ ... }   // for문 구조가 아예 안 맞음

for문은 for(초기값; 조건; 증가값) 형태로 세 부분을 세미콜론으로 구분해야 한다. 콤마나 부등호 위치가 다르면 컴파일 자체가 안 된다.

기본형으로 다시 짠 버전:

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

i를 1부터 n까지 1씩 올리면서, 짝수일 때만 sum에 더한다.

그런데 직접 더 짧은 풀이를 떠올렸다.

 
 
java
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 기준 흐름은 이렇다.

반복ianswer
1 2 0 + 2 = 2
2 4 2 + 4 = 6
3 6 6 + 6 = 12
4 8 12 + 8 = 20

2. 배열의 평균값 구하기

배열 원소를 합산해서 길이로 나누는 문제인데, 두 가지를 새로 정리했다.

for-each 문법

 
 
java
// 일반 for문 - 인덱스 필요
for (int i = 0; i < numbers.length; i++) {
    sum += numbers[i];
}

// for-each - 인덱스 없이 값만 순회
for (int n : numbers) {
    sum += n;
}

배열 안 값을 순서대로 꺼내기만 하면 되는 상황이라 인덱스가 필요 없다. 이럴 때는 for-each가 코드도 짧고 의도도 명확하다.

처음 짠 코드에서 변수명을 빼먹는 실수가 있었다.

 
 
java
for(int : numbers){   // 꺼낸 값을 담을 변수 이름이 없음

int 뒤에 받을 변수명(i 등)이 꼭 있어야 한다.

정수 나눗셈과 캐스팅

자바에서 int / int는 결과도 int로 떨어진다. 소수점은 버려진다.

 
 
java
int sum = 7, length = 2;
sum / length;            // 3  (소수점 버려짐)
(double) sum / length;   // 3.5

(double)을 sum 앞에 붙이면 그 순간 sum이 실수로 바뀌고, 나눗셈 전체가 실수 연산으로 처리된다. sum을 캐스팅하든 length를 캐스팅하든 결과는 같다.

 
 
java
(double) sum / numbers.length   // sum을 실수로
sum / (double) numbers.length   // length를 실수로

최종 코드:

 
 
java
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 중 어디에 붙여도 결과는 동일