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

Java 배열 집계와 랜덤: 최댓값·학점 빈도·중복 없는 로또

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

Java 배열 집계는 원소를 한 번씩 읽으면서 필요한 상태만 갱신하는 문제다. 최댓값·최솟값, 학점별 인원, 중복 없는 로또 번호를 비교하며 정렬이 꼭 필요한 경우와 그렇지 않은 경우를 구분해 보자.

선택 기준: 최솟값·최댓값과 개수는 한 번 순회, 출력 순서가 필요할 때만 정렬, 중복 방지는 이미 뽑은 값의 존재 여부를 검사한다.

배열에서 최솟값·최댓값을 찾고 학점 칸을 세며 중복 없는 공을 뽑는 세 가지 처리

1. 첫 원소로 최솟값과 최댓값을 시작한다

static int[] minMax(int[] numbers) {
    if (numbers.length == 0) {
        throw new IllegalArgumentException("빈 배열입니다.");
    }
    int min = numbers[0];
    int max = numbers[0];

    for (int i = 1; i < numbers.length; i++) {
        min = Math.min(min, numbers[i]);
        max = Math.max(max, numbers[i]);
    }
    return new int[] {min, max};
}

원문 10은 배열을 정렬해 양 끝을 읽었지만 최솟값과 최댓값만 필요하다면 O(N) 순회가 더 직접적이고 원본 순서도 보존한다.

2. 학점별 인원은 빈도 배열로 센다

static int[] countGrades(char[] grades) {
    int[] counts = new int[5]; // A, B, C, D, F
    for (char grade : grades) {
        int index = switch (grade) {
            case 'A' -> 0;
            case 'B' -> 1;
            case 'C' -> 2;
            case 'D' -> 3;
            case 'F' -> 4;
            default -> throw new IllegalArgumentException("잘못된 학점");
        };
        counts[index]++;
    }
    return counts;
}

원문 13처럼 변수 다섯 개를 따로 둘 수도 있지만 배열로 묶으면 출력도 반복할 수 있다. 허용하지 않는 E나 소문자가 들어왔을 때 처리 규칙도 명확히 정한다.

728x90

3. 중복 없는 로또 번호 만들기

static int[] lotto(Random random) {
    List<Integer> pool = new ArrayList<>();
    for (int number = 1; number <= 45; number++) {
        pool.add(number);
    }
    Collections.shuffle(pool, random);

    int[] result = new int[6];
    for (int i = 0; i < result.length; i++) {
        result[i] = pool.get(i);
    }
    Arrays.sort(result);
    return result;
}

원문 18의 재추첨 방식은 중복이 나오면 같은 인덱스를 다시 처리해야 한다. 값이 적은 로또 문제에서는 1~45를 한 번 섞고 앞의 6개를 고르면 중복 가능성이 구조적으로 사라진다.

4. 풀이별 시간과 원본 변화

문제풀이시간원본
최솟값·최댓값한 번 순회O(N)유지
학점 빈도인덱스별 카운트O(N)유지
중복 없는 추첨전체 후보 섞기O(45)새 목록

5. 실수하기 쉬운 부분

최솟값을 0으로 시작한다

양수 배열에서는 어떤 값도 0보다 작지 않아 최솟값이 잘못 남는다. 첫 원소로 초기화한다.

중복 검사 뒤 잘못된 인덱스를 출력한다

재추첨 때문에 i--한 직후 arr[i]를 출력하면 음수 인덱스가 될 수 있다. 값이 확정된 뒤에만 저장·출력한다.

랜덤 테스트가 매번 바뀐다

테스트에서는 new Random(42)처럼 시드를 고정해 재현 가능한 결과를 만든다.

핵심 요약
  • 최솟값·최댓값은 정렬 없이 한 번 순회한다.
  • 범주별 개수는 카운트 배열로 관리한다.
  • 후보 전체를 섞으면 중복 없는 추첨이 단순해진다.
  • 테스트에서는 랜덤 시드를 고정한다.
728x90