✨ Java에서 가장 효율적으로 최소값을 찾는 방법
알고리즘을 풀면서 여러 정수 중에서 최소값을 구할 수 있는 가장 효율적인 방법을 찾게 되었다.
for문으로 직접 비교하는 방법, Stream API를 이용하는 방법, Collection.min()을 사용하는 방법이 있었고, 셋다 시간복잡도는 O(n)으로 동일했다.
Arrays.sort로 정렬 후 가장 마지막 인덱스의 값을 가져오는 방법도 괜찮아 보였으나 시간복잡도가 O(nlogn)이어서 제외하였다.
근데 시간복잡도는 동일하나, 세가지 방법 중에서 직접 비교하는 방법이 가장 효율적이라고 하여 그 이유에 대해 정리해 보려한다.
✨ for문으로 직접 비교하는 방법
public static int findMin(int[] arr) {
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
return min;
}
for문을 사용하여 배열 안의 값들을 직접 하나씩 비교하는 방법이다.
시간 복잡도는 배열의 크기만큼 반복하므로 O(n)이고, 공간 복잡도는 추가적인 공간을 거의 사용하지 않기 때문에 O(1)이다.
단순히 배열을 순회하는 방법으로 불필요한 추가 연산이나 메모리 차지가 없어 가장 빠르고 효율적인 방법이라고 한다.
시간 복잡도 : O(n)
공간 복잡도 : O(1)
오버헤드 : 루프 하나로 처리하여 거의 없음.
✨ Stream API를 사용하는 방법
int min = Arrays.stream(arr).min().orElseThrow();
Java 8부터 지원하는 Stream API를 사용해서 최솟값을 구하는 방법이다.
이 방식은 내부적으로 람다식과 스트림 처리 과정을 거친다.
이 과정에서 객체 생성, 메소드 호출 등 추가적인 오버헤드가 발생하기 때문에 직접 비교하는 방법보다 느리다.
시간 복잡도 : O(n)
공간 복잡도 : O(1)
오버헤드 : 스트림 생성, 메소드 호출 등 추가적인 연산 발생.
✨ Collection.min()을 사용하는 방법
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int min = Collections.min(list);
리스트를 사용하여 Collections.min 메소드를 통해 최솟값을 찾는 방법이다.
리스트를 한번 순회하여 최솟값을 찾는 방법이지만, 내부적으로 여러 메소드 호출이 일어난다.
예를 들어 리스트의 요소를 읽어오기 위해 get() 메소드를 호출하게 되는데 이게 리스트의 구현 방식에 따라 시간 복잡도가 다르다고 한다. ArrayList의 경우 O(1)인 반면 LinkedList는 O(n)의 시간복잡도를 갖는다.
그래서 Collection.min을 사용하는 방식도 직접 비교하는 방법에 비해 오버헤드가 있기 때문에 더 느리다고 볼 수 있다.
시간 복잡도 : O(n)
공간 복잡도 : O(1)
오버헤드 : 메소드 호출 및 리스트의 특정 메소드(get()) 사용.
✨ 결론
결론적으로 직접 비교하는 방법이 가장 효율적인 이유는 불필요한 오버헤드가 없어서이다.
세가지 방법이 시간 복잡도와 공간 복잡도가 동일하지만 오버헤드 차이로 인해 실제 실행 속도가 달라질 수 있기 때문이다.
따라서 java에서 가장 효율적으로 최솟값을 찾고 싶다면 직접 비교하는 방식을 사용하면 된다 !!
'알고리즘' 카테고리의 다른 글
[백준 10989] Counting Sort (계수 정렬) 알고리즘 (0) | 2024.10.19 |
---|---|
[백준 10988] 팰린드롬인지 확인하기, StringBuilder.reverse() (4) | 2024.08.19 |
[백준 15552] 빠른 A+B, BufferedReader, BufferedWriter (2) | 2024.07.24 |
프로그래머스 181913 문자열 여러번 뒤집기 (25) | 2024.01.19 |
스택과 큐 (0) | 2023.08.24 |