배열에서 최댓값, 최솟값, 두 번째로 큰 값, 두 번째로 작은 값을 찾는 것은 자바 프로그래밍에서 자주 만나는 기본 문제입니다. 이 글에서는 Arrays.sort()를 활용하는 방법과 반복문으로 직접 정렬을 구현하는 방법, 두 가지 접근 방식을 예제 코드와 실행 결과와 함께 소개합니다.
방법 1: Arrays.sort() 활용하기
java.util.Arrays 클래스의 sort() 메서드를 사용하면 배열을 오름차순으로 간편하게 정렬할 수 있습니다. 정렬이 끝난 뒤에는 인덱스만 확인하면 원하는 값을 바로 얻을 수 있습니다.
예제 코드
import java.util.*;
public class Demo {
public static void main(String[] args) {
int arr[] = {55, 10, 8, 90, 43, 87, 95, 25, 50, 12};
System.out.println("배열 = " + Arrays.toString(arr));
Arrays.sort(arr);
System.out.println("정렬된 배열 = " + Arrays.toString(arr));
System.out.println("최솟값 = " + arr[0]);
System.out.println("두 번째로 작은 값 = " + arr[1]);
System.out.println("최댓값 = " + arr[arr.length - 1]);
System.out.println("두 번째로 큰 값 = " + arr[arr.length - 2]);
}
}
실행 결과
배열 = [55, 10, 8, 90, 43, 87, 95, 25, 50, 12] 정렬된 배열 = [8, 10, 12, 25, 43, 50, 55, 87, 90, 95] 최솟값 = 8 두 번째로 작은 값 = 10 최댓값 = 95 두 번째로 큰 값 = 90
핵심 포인트
- 오름차순 정렬 후에는 최솟값이 항상 arr[0], 최댓값이 arr[arr.length - 1]에 위치합니다.
- 두 번째로 작은 값은 arr[1], 두 번째로 큰 값은 arr[arr.length - 2]에서 가져옵니다.
- 인덱스를 숫자로 직접 쓰지 않고 arr.length를 활용하면 배열 크기가 달라져도 코드를 그대로 재사용할 수 있습니다.
- 배열에 중복 값이 있으면 중복이 그대로 포함되므로, 서로 다른 값 기준의 두 번째 순위가 필요하다면 별도의 처리가 필요합니다.
방법 2: 반복문으로 직접 정렬 구현하기
라이브러리에 의존하지 않고 정렬 로직을 스스로 작성하고 싶다면 이중 반복문을 이용한 교환 정렬 방식을 사용할 수 있습니다. 인접한 요소들을 비교해 더 작은 값을 앞쪽으로 옮기는 과정을 반복하면 배열 전체가 오름차순으로 정렬됩니다.
예제 코드
import java.util.*;
public class Demo {
public static void main(String[] args) {
int temp;
int arr[] = {55, 10, 8, 90, 43, 87, 95, 25, 50, 12};
System.out.println("배열 = " + Arrays.toString(arr));
int count = arr.length;
for (int i = 0; i < count; i++) {
for (int j = i + 1; j < count; j++) {
if (arr[i] > arr[j]) {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
System.out.println("최솟값: " + arr[0]);
System.out.println("최댓값: " + arr[count - 1]);
System.out.println("두 번째로 작은 값: " + arr[1]);
System.out.println("두 번째로 큰 값: " + arr[count - 2]);
}
}
실행 결과
배열 = [55, 10, 8, 90, 43, 87, 95, 25, 50, 12] 최솟값: 8 최댓값: 95 두 번째로 작은 값: 10 두 번째로 큰 값: 90
동작 원리
바깥쪽 반복문(i)이 기준 위치를 정하고, 안쪽 반복문(j)이 그 뒤에 있는 요소들과 값을 비교합니다. 기준 값이 더 크면 임시 변수 temp를 이용해 두 요소의 값을 서로 교환(swap)합니다. 이 과정을 모든 요소에 대해 반복하면 배열이 오름차순으로 완전히 정렬됩니다.
성능 비교 및 마무리
Arrays.sort()는 내부적으로 듀얼 피벗 퀵소트(Dual-Pivot Quicksort)를 사용해 평균 O(n log n)의 성능을 보이는 반면, 이중 반복문 방식은 O(n²)으로 데이터가 많아질수록 실행 속도가 느려집니다. 따라서 실무에서는 Arrays.sort()를 활용하는 첫 번째 방법이 권장되며, 두 번째 방법은 정렬 알고리즘의 동작 원리를 학습할 때 유용합니다. 참고로 네 개의 값만 필요하다면 배열을 한 번만 순회하면서 최솟값·최댓값과 두 번째 순위를 동시에 추적하는 O(n) 알고리즘을 고려해볼 수도 있습니다.