배열에 담긴 숫자들을 짝수와 홀수로 구분해 서로 다른 두 개의 배열에 나누어 담는 것은 자바에서 자주 만나게 되는 기본적인 문제입니다. 이 글에서는 Scanner를 사용해 사용자로부터 배열을 입력받고, 나머지 연산자(%)를 활용해 짝수와 홀수를 분류하는 방법을 예제 코드와 함께 살펴봅니다.
예제 코드
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
int n, j = 0, k = 0;
Scanner s = new Scanner(System.in);
System.out.println("저장할 요소의 개수를 입력하세요 : ");
n = s.nextInt();
int my_arr[] = new int[n];
int odd_vals[] = new int[n];
int even_vals[] = new int[n];
System.out.println("배열의 요소를 입력하세요(짝수와 홀수) : ");
for (int i = 0; i < n; i++) {
my_arr[i] = s.nextInt();
}
for (int i = 0; i < n; i++) {
if (my_arr[i] % 2 != 0) {
odd_vals[j] = my_arr[i];
j++;
} else {
even_vals[k] = my_arr[i];
k++;
}
}
System.out.print("배열의 홀수 : ");
if (j > 0) {
for (int i = 0; i < j - 1; i++) {
System.out.print(odd_vals[i] + ",");
}
System.out.print(odd_vals[j - 1]);
} else {
System.out.println("홀수가 없습니다.");
}
System.out.println();
System.out.print("배열의 짝수 : ");
if (k > 0) {
for (int i = 0; i < k - 1; i++) {
System.out.print(even_vals[i] + ",");
}
System.out.print(even_vals[k - 1]);
} else {
System.out.println("배열에 짝수가 없습니다.");
}
}
}출력 결과
저장할 요소의 개수를 입력하세요 : 배열의 요소를 입력하세요(짝수와 홀수) : 배열의 홀수 : 1,9 배열의 짝수 : 2,4,6
콘솔 입력
5 1 2 4 6 9
코드 설명
'Demo' 클래스의 main 함수는 먼저 사용자에게 배열에 저장할 요소의 개수를 입력받습니다. 이어서 홀수 값을 저장할 배열과 짝수 값을 저장할 배열, 총 두 개의 새로운 배열을 선언합니다.
사용자로부터 배열 요소를 모두 입력받은 뒤에는 'for' 루프를 돌며 각 숫자를 2로 나눈 나머지가 0인지 검사합니다. 나머지가 0이 아니면 홀수이므로 odd_vals 배열에 저장하고, 나머지가 0이면 짝수이므로 even_vals 배열에 저장합니다. 마지막으로 각 배열의 값을 출력해 분류 결과를 보여줍니다. 이 방식은 배열의 모든 요소를 한 번씩만 검사하면 되므로 시간 복잡도가 O(n)으로 매우 효율적입니다.
원본 예제의 오류 바로잡기
원본 코드에서는 1을 '짝수도 홀수도 아닌 수'로 출력했지만, 수학적으로 1은 분명한 홀수입니다. 위 코드에서는 이러한 로직을 제거해 1도 일반적인 홀수로 분류되도록 수정했으며, 홀수나 짝수가 하나뿐인 경우에도 올바르게 출력되도록 조건문을 정비했습니다.
대안: ArrayList와 스트림(Stream) 활용하기
배열 크기를 미리 정하기 어렵거나 더 유연한 처리가 필요하다면 ArrayList와 스트림 API를 사용하는 방법도 좋습니다.
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
int[] my_arr = {1, 2, 4, 6, 9};
List<Integer> evenList = Arrays.stream(my_arr)
.filter(v -> v % 2 == 0)
.boxed()
.collect(Collectors.toList());
List<Integer> oddList = Arrays.stream(my_arr)
.filter(v -> v % 2 != 0)
.boxed()
.collect(Collectors.toList());
System.out.println("짝수 : " + evenList); // [2, 4, 6]
System.out.println("홀수 : " + oddList); // [1, 9]스트림 방식은 필터 조건만 바꾸면 되기 때문에 가독성이 좋고, 결과를 List 형태로 바로 받을 수 있어 실무에서도 널리 사용됩니다.