자바 코딩테스트 강좌, 최솟값 찾기 1

문제 정의

여러분은 주어진 정수 배열에서 최솟값을 찾는 문제를 풀어야 합니다. 이 문제는 코딩테스트와 알고리즘 문제 풀이에서 매우 기초적이고 기본적인 문제로, 배열을 다루는 기본적인 사고를 필요로 합니다. 여러분은 이 문제를 통해 배열과 루프를 사용하는 방법, 조건문을 활용하는 방법을 연습할 수 있을 것입니다.

문제 설명

정수 배열 nums가 주어질 때, 배열 내에서 최솟값을 찾아 반환하는 함수를 작성하세요.

예를 들어, 배열이 [3, 1, 4, 1, 5, 9, 2, 6, 5] 일 경우 최솟값인 1을 반환해야 합니다.

입력 및 출력 형식

  • 입력: 정수 배열 nums (1 ≤ |nums| ≤ 105, -109 ≤ nums[i] ≤ 109)
  • 출력: 배열 내 최솟값

접근 방법

이 문제는 아래와 같은 접근 방식을 통해 해결할 수 있습니다.

  1. 배열이 비어있는지 확인합니다. 비어있다면 예외 처리를 합니다.
  2. 배열의 첫 번째 요소를 최솟값으로 초기화합니다.
  3. 배열을 순회하며 각 요소와 현재 최솟값을 비교합니다.
  4. 현재 요소가 최솟값보다 작으면 최솟값을 갱신합니다.
  5. 모든 요소를 확인한 후 최솟값을 반환합니다.

상세 풀이 과정

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)입니다. 추가적인 데이터 구조를 사용하지 않고, 단지 정수 변수 하나만 사용하는 방식이므로 공간을 거의 차지하지 않습니다.

결론

이번 강좌를 통해 여러분은 배열에서 최솟값을 찾는 알고리즘을 구현해보았습니다. 이 문제는 기초적인 알고리즘이지만, 이후 더 복잡한 문제로 확장될 수 있는 기반을 마련해줍니다. 배열과 루프를 사용한 기본적인 사고 방식을 익혔기 때문에 앞으로의 알고리즘 문제에서도 유용하게 사용할 수 있을 것입니다.

다음 강좌에서는 더욱 복잡한 알고리즘 문제를 다루게 될 것입니다. 많은 기대 부탁드립니다.