안녕하세요! 이번 포스트에서는 코틀린 코딩테스트 강좌의 일환으로 ‘최솟값 찾기 2’라는 주제를 다뤄보겠습니다. 여러 알고리즘 문제 중에서도 최솟값을 찾는 문제는 흔히 접할 수 있는 문제로, 다양한 변형이 존재합니다. 이번 글에서는 문제를 정의하고, 이를 해결하기 위한 코틀린 알고리즘을 단계별로 설명하겠습니다.
문제 정의
다음과 같은 문제를 해결해보겠습니다:
문제: 정수 배열
nums
가 주어졌을 때, 배열 내에서 가장 작은 요소를 찾는 프로그램을 작성하시오. 단, 배열의 크기는 1 이상이며, 정수 값은 -109에서 109까지의 범위를 가진다고 가정합니다. 배열이 비어있거나, 명세와 다른 값을 포함할 경우에는IllegalArgumentException
를 발생시켜야 합니다.
문제 분석
문제를 해결하기 위해, 배열 내에서 가장 작은 수를 찾는 알고리즘을 고려해야 합니다. 최솟값을 찾기 위해 기본적인 아이디어는 배열을 한 번 순회하면서 각 원소를 비교하여 최소값을 갱신하는 것입니다. 배열을 한 번 순회하는 방식은 시간 복잡도 O(n)을 가지며, 이는 매우 효율적인 방법입니다. 이 방법 외에도 다양한 알고리즘이 있지만, 여기에서는 가장 기본적인 접근 방식을 사용할 것입니다.
알고리즘 설계
알고리즘은 다음과 같은 단계로 이루어집니다:
- 예외 처리: 배열이 비어있는 경우에는
IllegalArgumentException
을 발생시킵니다. - 최솟값 초기화: 배열의 첫 번째 요소를 최솟값으로 초기화합니다.
- 배열 순회: 배열의 각 요소를 확인하여 현재 최솟값보다 작은 값이 발견되면 최솟값을 업데이트합니다.
- 최솟값 반환: 최종적으로 찾은 최솟값을 반환합니다.
코틀린 코드 구현
이제 위의 알고리즘을 구현한 코드를 살펴보겠습니다:
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
- 테스트 케이스: (빈 배열) -> 예외 발생: 배열이 비어있습니다.
결론
이번 강좌에서는 코틀린을 사용해 최솟값 찾기 문제를 해결하는 과정을 살펴보았습니다. 배열의 가장 작은 값을 찾는 기본적인 알고리즘이지만, 배열을 순회하면서 조건을 체크하는 방식으로 효율적이고 간단하게 문제를 해결할 수 있었습니다. 이와 같은 문제는 코딩 테스트에서 자주 출제되므로, 기본적인 알고리즘 연습에 매우 유용합니다.
이 강좌가 도움이 되셨기를 바라며, 알고리즘 실력을 키우는 데 많은 도움이 되길 바랍니다! 추가 질문이나 피드백이 있다면 언제든지 댓글로 남겨주세요.
참고 자료
앞으로도 다양한 문제와 알고리즘에 대해 지속적으로 배워 나가시길 바랍니다. 감사합니다!