코틀린 코딩테스트 강좌, 최솟값 찾기 2

안녕하세요! 이번 포스트에서는 코틀린 코딩테스트 강좌의 일환으로 ‘최솟값 찾기 2’라는 주제를 다뤄보겠습니다. 여러 알고리즘 문제 중에서도 최솟값을 찾는 문제는 흔히 접할 수 있는 문제로, 다양한 변형이 존재합니다. 이번 글에서는 문제를 정의하고, 이를 해결하기 위한 코틀린 알고리즘을 단계별로 설명하겠습니다.

문제 정의

다음과 같은 문제를 해결해보겠습니다:

문제: 정수 배열 nums가 주어졌을 때, 배열 내에서 가장 작은 요소를 찾는 프로그램을 작성하시오. 단, 배열의 크기는 1 이상이며, 정수 값은 -109에서 109까지의 범위를 가진다고 가정합니다. 배열이 비어있거나, 명세와 다른 값을 포함할 경우에는 IllegalArgumentException를 발생시켜야 합니다.

문제 분석

문제를 해결하기 위해, 배열 내에서 가장 작은 수를 찾는 알고리즘을 고려해야 합니다. 최솟값을 찾기 위해 기본적인 아이디어는 배열을 한 번 순회하면서 각 원소를 비교하여 최소값을 갱신하는 것입니다. 배열을 한 번 순회하는 방식은 시간 복잡도 O(n)을 가지며, 이는 매우 효율적인 방법입니다. 이 방법 외에도 다양한 알고리즘이 있지만, 여기에서는 가장 기본적인 접근 방식을 사용할 것입니다.

알고리즘 설계

알고리즘은 다음과 같은 단계로 이루어집니다:

  1. 예외 처리: 배열이 비어있는 경우에는 IllegalArgumentException을 발생시킵니다.
  2. 최솟값 초기화: 배열의 첫 번째 요소를 최솟값으로 초기화합니다.
  3. 배열 순회: 배열의 각 요소를 확인하여 현재 최솟값보다 작은 값이 발견되면 최솟값을 업데이트합니다.
  4. 최솟값 반환: 최종적으로 찾은 최솟값을 반환합니다.

코틀린 코드 구현

이제 위의 알고리즘을 구현한 코드를 살펴보겠습니다:

fun findMinimum(nums: IntArray): Int {
    // 1. 배열이 비어있는지 확인
    if (nums.isEmpty()) {
        throw IllegalArgumentException("배열이 비어있습니다.")
    }

    // 2. 최솟값 초기화
    var minValue = nums[0]

    // 3. 배열 순회
    for (num in nums) {
        if (num < minValue) {
            minValue = num
        }
    }

    // 4. 최솟값 반환
    return minValue
}

코드 설명

위 코드를 살펴보면:

  • fun findMinimum(nums: IntArray): Int: 이 함수는 정수 배열을 매개변수로 받아 최솟값을 반환합니다.
  • if (nums.isEmpty()): 배열이 비어 있는 경우, 예외를 발생시킵니다.
  • var minValue = nums[0]: 배열의 첫 번째 요소로 최솟값을 초기화합니다.
  • for (num in nums): 배열의 모든 요소를 순회하면서
  • if (num < minValue): 현재 요소가 최솟값보다 작으면, 최솟값을 갱신합니다.
  • 마지막으로 최솟값을 반환합니다.

테스트 케이스

이제 구현된 함수를 테스트하기 위한 몇 가지 테스트 케이스를 살펴보겠습니다:

fun main() {
    val testCases = arrayOf(
        intArrayOf(3, 5, 1, 8, 2),
        intArrayOf(-1, -3, -5, -2),
        intArrayOf(10),
        intArrayOf(0, 1, 0, -1, -2, 2, 1),
        intArrayOf()
    )

    for (testCase in testCases) {
        try {
            println("테스트 케이스: ${testCase.joinToString(", ")} -> 최솟값: ${findMinimum(testCase)}")
        } catch (e: IllegalArgumentException) {
            println("테스트 케이스: ${testCase.joinToString(", ")} -> 예외 발생: ${e.message}")
        }
    }
}

테스트 결과

위의 테스트 케이스를 실행해본 결과는 다음과 같습니다:

  • 테스트 케이스: 3, 5, 1, 8, 2 -> 최솟값: 1
  • 테스트 케이스: -1, -3, -5, -2 -> 최솟값: -5
  • 테스트 케이스: 10 -> 최솟값: 10
  • 테스트 케이스: 0, 1, 0, -1, -2, 2, 1 -> 최솟값: -2
  • 테스트 케이스: (빈 배열) -> 예외 발생: 배열이 비어있습니다.

결론

이번 강좌에서는 코틀린을 사용해 최솟값 찾기 문제를 해결하는 과정을 살펴보았습니다. 배열의 가장 작은 값을 찾는 기본적인 알고리즘이지만, 배열을 순회하면서 조건을 체크하는 방식으로 효율적이고 간단하게 문제를 해결할 수 있었습니다. 이와 같은 문제는 코딩 테스트에서 자주 출제되므로, 기본적인 알고리즘 연습에 매우 유용합니다.

이 강좌가 도움이 되셨기를 바라며, 알고리즘 실력을 키우는 데 많은 도움이 되길 바랍니다! 추가 질문이나 피드백이 있다면 언제든지 댓글로 남겨주세요.

참고 자료

앞으로도 다양한 문제와 알고리즘에 대해 지속적으로 배워 나가시길 바랍니다. 감사합니다!