작성자: 조광형
작성일: 2024년 11월 26일
1. 문제 설명
주어진 정수 배열에서 최솟값을 찾는 문제입니다.
배열에는 중복된 값이 있을 수 있으며, 배열의 길이는 1 이상 100,000 이하입니다.
함수는 최솟값을 반환해야 합니다. 만약 배열이 비어 있는 경우 nil을 반환해야 합니다.
함수 시그니처:
func findMinimum(in array: [Int]) -> Int?
2. 입력 예시
- 입력: [3, 5, 1, 2, 4] ➞ 출력: 1
- 입력: [10, 20, 30, 5, 15] ➞ 출력: 5
- 입력: [] ➞ 출력: nil
- 입력: [5, 5, 5, 5] ➞ 출력: 5
3. 문제 풀이 과정
이 문제를 해결하기 위해서는 기본적인 배열 탐색 알고리즘을 사용할 수 있습니다.
최솟값을 찾기 위해 배열의 각 요소를 순회하면서 현재 최솟값보다 작은 요소가 있는지 확인해야 합니다.
아래는 문제를 푸는 과정입니다.
3.1. 알고리즘 설계
1. 배열이 비어 있는지 확인합니다. 비어 있다면 nil을 반환합니다.
2. 첫 번째 요소를 최솟값으로 초기화합니다.
3. 배열의 각 요소를 순회하면서 현재 최솟값보다 작은 요소를 찾습니다.
4. 최솟값이 업데이트되면 이를 계속 저장합니다.
5. 최종 최솟값을 반환합니다.
3.2. 시간 복잡도
이 알고리즘은 한 번의 배열 순회를 통해 최솟값을 찾기 때문에
시간 복잡도는 O(n)입니다. 여기서 n은 배열의 길이입니다.
최악의 경우에도 배열의 모든 요소를 확인해야 하므로
효율적인 방법이라 할 수 있습니다.
3.3. 코드 구현
이제 위의 알고리즘을 스위프트로 구현해봅시다.
func findMinimum(in array: [Int]) -> Int? {
// 배열이 비어있는 경우
guard !array.isEmpty else {
return nil
}
var minimum = array[0] // 첫 번째 요소를 초기화
for number in array {
if number < minimum { // 현재 최솟값보다 작다면
minimum = number // 최솟값 업데이트
}
}
return minimum // 최솟값 반환
}
4. 테스트 케이스
함수 작성 후, 다양한 입력을 가지고 테스트를 진행해보아야 합니다.
아래는 여러 케이스에 대한 테스트 코드입니다.
let testCases = [
([3, 5, 1, 2, 4], 1),
([10, 20, 30, 5, 15], 5),
([], nil),
([5, 5, 5, 5], 5),
([100, 200, 50, 150], 50)
]
for (input, expected) in testCases {
let output = findMinimum(in: input)
print("입력: \(input), 기대값: \(expected), 출력: \(String(describing: output))")
}
5. 결론
이번 강좌에서는 주어진 배열에서 최솟값을 찾는 알고리즘을
스위프트로 구현해보았습니다. 알고리즘의 기본 개념과
구현 방법을 이해했다면, 다양한 입력에 대한 테스트 케이스를 통해
로직을 검증하는 것도 중요합니다. 앞으로 더 많은 알고리즘 문제를
통해 스위프트 코딩 능력을 향상해 보세요!