문제 정의
여러분은 주어진 정수 배열에서 최솟값을 찾는 문제를 풀어야 합니다. 이 문제는 코딩테스트와 알고리즘 문제 풀이에서 매우 기초적이고 기본적인 문제로, 배열을 다루는 기본적인 사고를 필요로 합니다. 여러분은 이 문제를 통해 배열과 루프를 사용하는 방법, 조건문을 활용하는 방법을 연습할 수 있을 것입니다.
문제 설명
정수 배열 nums
가 주어질 때, 배열 내에서 최솟값을 찾아 반환하는 함수를 작성하세요.
예를 들어, 배열이 [3, 1, 4, 1, 5, 9, 2, 6, 5]
일 경우 최솟값인 1
을 반환해야 합니다.
입력 및 출력 형식
- 입력: 정수 배열
nums
(1 ≤ |nums| ≤ 105, -109 ≤ nums[i] ≤ 109) - 출력: 배열 내 최솟값
접근 방법
이 문제는 아래와 같은 접근 방식을 통해 해결할 수 있습니다.
- 배열이 비어있는지 확인합니다. 비어있다면 예외 처리를 합니다.
- 배열의 첫 번째 요소를 최솟값으로 초기화합니다.
- 배열을 순회하며 각 요소와 현재 최솟값을 비교합니다.
- 현재 요소가 최솟값보다 작으면 최솟값을 갱신합니다.
- 모든 요소를 확인한 후 최솟값을 반환합니다.
상세 풀이 과정
1. 배열 비어 있는지 체크
먼저, 입력으로 주어진 배열이 비어 있는지 확인해야 합니다. 배열이 비어 있다면 최솟값을 찾는 것이 불가능하므로 이 경우 적절한 예외 처리를 해줘야 합니다. 예를 들어, 배열이 비어 있을 때는 IllegalArgumentException
을 던질 수 있습니다.
2. 최솟값 초기화
배열의 첫 번째 요소를 최솟값으로 설정합니다. 이렇게 하면 각 요소를 순회하며 비교할 수 있는 기준값이 생성됩니다.
3. 배열 탐색
배열을 순회하면서 각 요소를 최솟값과 비교합니다. 안정적인 방법으로 최솟값을 찾기 위해 일반적으로 for
반복문을 사용합니다. 모든 요소를 체크할 필요가 있습니다.
4. 최솟값 비교 및 갱신
현재 확인 중인 요소가 최솟값보다 작으면 최솟값을 갱신합니다. 이를 통해 최종적으로 배열 내에서 가장 작은 값을 갖게 될 것입니다.
5. 최솟값 반환
모든 요소를 확인한 후, 최솟값을 반환합니다.
자바 구현
public class MinFinder {
public static int findMin(int[] nums) {
// 비어 있는 배열 체크
if (nums.length == 0) {
throw new IllegalArgumentException("배열이 비어 있습니다.");
}
// 배열의 첫 번째 요소로 초기화
int min = nums[0];
// 배열을 순회하며 최솟값 찾기
for (int i = 1; i < nums.length; i++) {
if (nums[i] < min) {
min = nums[i]; // 최솟값 갱신
}
}
// 최솟값 반환
return min;
}
public static void main(String[] args) {
int[] nums = {3, 1, 4, 1, 5, 9, 2, 6, 5};
int minValue = findMin(nums);
System.out.println("최솟값: " + minValue); // 출력: 최솟값: 1
}
}
시간 복잡도 분석
이 알고리즘의 시간 복잡도는 O(n)입니다. 배열의 모든 요소를 한 번씩 살펴봐야 하므로 입력의 크기에 대한 선형적 성질을 유지합니다. 이는 최적의 시간 복잡도입니다.
공간 복잡도 분석
이 알고리즘의 공간 복잡도는 O(1)입니다. 추가적인 데이터 구조를 사용하지 않고, 단지 정수 변수 하나만 사용하는 방식이므로 공간을 거의 차지하지 않습니다.
결론
이번 강좌를 통해 여러분은 배열에서 최솟값을 찾는 알고리즘을 구현해보았습니다. 이 문제는 기초적인 알고리즘이지만, 이후 더 복잡한 문제로 확장될 수 있는 기반을 마련해줍니다. 배열과 루프를 사용한 기본적인 사고 방식을 익혔기 때문에 앞으로의 알고리즘 문제에서도 유용하게 사용할 수 있을 것입니다.
다음 강좌에서는 더욱 복잡한 알고리즘 문제를 다루게 될 것입니다. 많은 기대 부탁드립니다.