본문 바로가기
자격증·공부 아카이브/Java 기초

Java while문 실전: 목표 달성·덧셈 게임·종료 조건

by 쑥쑥자라나라 2026. 8. 2.
728x90

Java 반복문 누적 계산은 매번 나온 값을 한 변수에 더하거나 곱하는 문제다. 부호가 번갈아 바뀌는 합, 두 수가 반대 방향으로 움직이는 곱의 합, 증가 폭이 커지는 수열, 팩토리얼을 비교하면 초기값과 갱신식이 왜 중요한지 보인다.

세 줄로 설계: 누적값의 초기값 → 이번 반복에서 만들 값 → 다음 반복을 위한 상태 갱신.

덧셈 누적과 곱셈 누적, 증가 폭이 달라지는 수열을 한눈에 비교

1. 누적 연산에 맞는 항등값을 고른다

연산 초기값 이유
0 어떤 수에 0을 더해도 값이 유지된다.
1 어떤 수에 1을 곱해도 값이 유지된다.
최솟값 첫 원소 또는 큰 값 실제 값과 비교하며 줄여 간다.

팩토리얼을 0에서 시작하면 첫 곱셈부터 결과가 모두 0이 된다. 반대로 합을 1에서 시작하면 실제 답보다 1이 커진다.

2. 1-2+3-4+…+99-100 계산

int sum = 0;
for (int i = 1; i <= 100; i++) {
    sum += (i % 2 == 1) ? i : -i;
}
System.out.println(sum); // -50

원문 3은 홀수는 더하고 짝수는 빼는 규칙이다. sum = sum - isum += -i는 같은 뜻이지만, 부호가 바뀌는 항을 만든다고 생각하면 후자가 식과 더 닮았다.

728x90

3. 두 값이 반대 방향으로 움직이는 곱의 합

long sum = 0;
for (int right = 1; right <= 77; right++) {
    int left = 78 - right;
    sum += (long) left * right;
}

원문 6의 77×1 + 76×2 + … + 1×77은 한쪽은 감소하고 다른 쪽은 증가한다. 변수를 두 개 갱신해도 되지만 left + right = 78 관계를 식으로 만들면 상태가 하나 줄어든다.

4. 1, 2, 4, 7, 11 수열

int value = 1;
for (int i = 1; i <= n; i++) {
    System.out.print(value + " ");
    value += i;
}

원문 15의 항 사이 차이는 1, 2, 3, 4처럼 증가한다. 현재 항을 먼저 출력한 뒤 value += i로 다음 항을 만든다. 출력과 갱신 순서가 바뀌면 첫 항부터 2가 나온다.

5. N!은 1부터 곱한다

static long factorial(int n) {
    if (n < 0) {
        throw new IllegalArgumentException("n은 0 이상이어야 합니다.");
    }
    long result = 1;
    for (int i = 2; i <= n; i++) {
        result *= i;
    }
    return result;
}

0! = 1이므로 0도 처리한다. long은 20!까지 안전하고 21!부터 범위를 넘는다. 더 큰 값은 BigInteger를 사용해야 한다.

6. 실수하기 쉬운 부분

출력과 갱신 순서를 바꾼다

수열은 현재 값을 출력한 뒤 다음 값을 계산하는지 표로 한 번 추적한다.

int 범위를 넘긴다

곱셈은 대입 전에 이미 int로 계산될 수 있다. 피연산자 하나를 long으로 바꾼다.

반복 경계를 한 칸 틀린다

1부터 N까지면 i <= n, N개 반복이면 보통 i < n이다.

핵심 요약
  • 합은 0, 곱은 1에서 시작한다.
  • 현재 항과 다음 항을 만드는 갱신식을 분리한다.
  • 관계식으로 상태 변수 수를 줄일 수 있다.
  • 팩토리얼은 오버플로 범위를 확인한다.
728x90