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
'자격증·공부 아카이브 > Java 기초' 카테고리의 다른 글
| Java 2차원 배열 완전정리: 세로·지그재그 채우기와 90도 회전 (0) | 2026.08.05 |
|---|---|
| Java 문자열 집계 문제: 알파벳 빈도·OX 점수·숫자 대시 개수 (0) | 2026.08.03 |
| Java 숫자 계산 예제: 거스름돈·반올림·구구단·세 자리 곱셈 (0) | 2026.08.02 |
| Java while문 실전: 목표 달성·덧셈 게임·종료 조건 (0) | 2026.08.02 |
| Java 반복문 누적 계산: 교대 합·수열·팩토리얼 풀이 (0) | 2026.08.01 |