이 글에서는 Java를 사용해 리스트(List)에서 최솟값과 최댓값을 구하는 방법을 알아보겠습니다.
리스트란 무엇인가?
리스트는 요소를 순차적으로 저장하고 접근할 수 있는 정렬된 컬렉션(ordered collection)입니다. 인덱스 기반 메서드를 제공하기 때문에 요소를 손쉽게 삽입, 수정, 삭제, 검색할 수 있으며, 중복된 요소도 허용합니다.
문제 상황 예시
아래와 같은 입력 리스트가 있다고 가정해 보겠습니다.
입력 리스트: [500, 650, 300, 250, 110]
원하는 출력 결과는 다음과 같습니다.
리스트의 최솟값: 110 리스트의 최댓값: 650
알고리즘
전체 과정은 다음 단계로 진행됩니다.
- 시작 — 프로그램을 실행합니다.
input_list라는 이름의 리스트를 선언합니다.- 리스트에 값을 정의(추가)합니다.
- 내장 함수
Collections.sort()를 사용해 리스트를 오름차순으로 정렬합니다. - 정렬된 리스트의 첫 번째 요소가 최솟값, 마지막 요소가 최댓값입니다. 빈 리스트 여부는
Integer.MAX_VALUE,Integer.MIN_VALUE로 처리합니다. - 결과를 화면에 출력합니다.
- 종료
예제 1: main 함수에서 모든 로직 처리
첫 번째 방식은 모든 연산을 main 함수 안에서 한 번에 처리하는 절차적 접근입니다.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Demo {
public static void main(String[] args) {
System.out.println("필요한 패키지를 가져왔습니다");
List<Integer> input_list = new ArrayList<>();
input_list.add(500);
input_list.add(650);
input_list.add(300);
input_list.add(250);
input_list.add(110);
System.out.println("정의된 리스트: " + input_list);
List<Integer> sortedlist = new ArrayList<>(input_list);
Collections.sort(sortedlist);
if (sortedlist == null || sortedlist.size() == 0) {
System.out.println("\n리스트의 최솟값: " + Integer.MAX_VALUE);
}
System.out.println("\n리스트의 최솟값: " + sortedlist.get(0));
if (sortedlist == null || sortedlist.size() == 0) {
System.out.println("리스트의 최댓값: " + Integer.MIN_VALUE);
return;
}
int list_size = sortedlist.size() - 1;
System.out.println("리스트의 최댓값: " + sortedlist.get(list_size));
}
}실행 결과
필요한 패키지를 가져왔습니다 정의된 리스트: [500, 650, 300, 250, 110] 리스트의 최솟값: 110 리스트의 최댓값: 650
예제 2: 객체 지향 방식으로 함수 분리
두 번째 방식은 연산을 별도의 함수로 캡슐화하여 재사용성과 가독성을 높인 객체 지향 프로그래밍(OOP) 스타일입니다.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Demo {
public static Integer get_min_value(List<Integer> sortedlist) {
if (sortedlist == null || sortedlist.size() == 0) {
return Integer.MAX_VALUE;
}
return sortedlist.get(0);
}
public static Integer get_max_value(List<Integer> sortedlist) {
if (sortedlist == null || sortedlist.size() == 0) {
return Integer.MIN_VALUE;
}
int list_size = sortedlist.size() - 1;
return sortedlist.get(list_size);
}
public static void main(String[] args) {
System.out.println("필요한 패키지를 가져왔습니다");
List<Integer> input_list = new ArrayList<>();
input_list.add(500);
input_list.add(650);
input_list.add(300);
input_list.add(250);
input_list.add(110);
System.out.println("정의된 리스트: " + input_list);
List<Integer> sortedlist = new ArrayList<>(input_list);
Collections.sort(sortedlist);
System.out.println("\n리스트의 최솟값: " + get_min_value(sortedlist));
System.out.println("리스트의 최댓값: " + get_max_value(sortedlist));
}
}실행 결과
필요한 패키지를 가져왔습니다 정의된 리스트: [500, 650, 300, 250, 110] 리스트의 최솟값: 110 리스트의 최댓값: 650
더 간단한 대안: Collections.min() / max()
사실 Java에서는 리스트를 직접 정렬하지 않고도 java.util.Collections 클래스가 제공하는 유틸리티 메서드로 최솟값과 최댓값을 즉시 구할 수 있습니다.
int min = Collections.min(input_list); // 110 int max = Collections.max(input_list); // 650
또한 Java 8 이상에서는 Stream API를 활용할 수도 있습니다.
int min = input_list.stream().mapToInt(Integer::intValue).min().getAsInt(); int max = input_list.stream().mapToInt(Integer::intValue).max().getAsInt();
마무리
정리하면, 리스트에서 최솟값과 최댓값을 구하는 대표적인 방법은 세 가지입니다.
- 정렬 후 첫/마지막 요소 조회 — 알고리즘 학습에 유용하지만 O(n log n)의 시간 복잡도가 듭니다.
- Collections.min() / max() — 가장 간결하고 실무에서 널리 쓰이는 방식입니다.
- Stream API — 함수형 스타일로 필터링 등 추가 연산과 조합하기 좋습니다.
상황에 맞는 방법을 선택해 효율적으로 활용해 보시기 바랍니다.