스위프트 코딩테스트 강좌, 최솟값 찾기 1

작성자: 조광형

작성일: 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. 결론

이번 강좌에서는 주어진 배열에서 최솟값을 찾는 알고리즘을
스위프트로 구현해보았습니다. 알고리즘의 기본 개념과
구현 방법을 이해했다면, 다양한 입력에 대한 테스트 케이스를 통해
로직을 검증하는 것도 중요합니다. 앞으로 더 많은 알고리즘 문제를
통해 스위프트 코딩 능력을 향상해 보세요!