스위프트 코딩테스트 강좌, 수를 묶어서 최댓값 만들기

문제 정의

주어진 수의 배열에서 수를 묶어서 최댓값을 만드는 함수를 작성하세요. 이 문제에서 수를 묶는 방법은 각 수를 선택하거나, 두 개를 선택하여 더하고, 세 개 이상을 선택하여 곱할 수 있습니다. 최댓값을 만드는 방법을 고려하여 코드를 작성해야 합니다.

입력 및 출력 형식

입력

정수 N (1 ≤ N ≤ 1000)과 N개의 정수가 포함된 배열이 주어집니다.

출력

최댓값을 출력합니다.

예제

입력

    5
    1 2 3 4 5
    

출력

    120
    

문제 접근 방법

이 문제를 해결하기 위해서는 수를 조합할 때, 특히 두 개 이상의 수를 곱하는 것이 최댓값을 증가시키는 데 큰 영향을 미친다는 점을 고려해야 합니다. 이에 따라 수의 배열을 정렬하고, 최댓값을 추적하여 최적의 조합을 찾아야 합니다. 기본적인 접근 방법은 다음과 같습니다:

  1. 배열을 오름차순으로 정렬합니다.
  2. 배열의 끝에서부터 하나씩 더하거나 곱하는 방식으로 최댓값을 계산합니다.
  3. 특히, 0 이상의 수가 연속해서 있을 때는 곱하는 것이 유리합니다.
  4. 0이나 1이 포함된 경우는 별도로 처리하여 최댓값을 완벽하게 계산합니다.

구현 단계

이제 위의 접근 방법을 바탕으로 스위프트 코드를 구현해 보겠습니다. 아래는 문제를 해결하기 위한 코드입니다.

    func maximumValue(from numbers: [Int]) -> Int {
        let sortedNumbers = numbers.sorted()
        var maxValue = 0
        var i = sortedNumbers.count - 1
        
        while i >= 0 {
            if i > 0, sortedNumbers[i] > 1, sortedNumbers[i - 1] > 1 {
                maxValue += sortedNumbers[i] * sortedNumbers[i - 1]
                i -= 2
            } else {
                maxValue += sortedNumbers[i]
                i -= 1
            }
        }
        
        return maxValue
    }
    
    // 예시 입력
    let inputNumbers = [1, 2, 3, 4, 5]
    let result = maximumValue(from: inputNumbers)
    print(result) // 출력: 120
    

코드 설명

위의 코드는 주어진 수의 배열에서 최댓값을 만드는 함수 `maximumValue`를 정의하고 있습니다. 이 함수는 다음과 같은 작업을 수행합니다:

  1. 배열을 오름차순으로 정렬합니다.
  2. 배열의 끝에서 시작하여 두 개씩 곱하거나 한 개씩 더하는 방식으로 최대 값을 계산합니다.
  3. 최종적으로 계산된 최대 값을 반환합니다.

테스트 케이스

여러 가지 테스트 케이스를 통해 코드의 정확성을 확인해 보겠습니다.

    let testCases = [
        [1, 2, 3, 4, 5],
        [0, 2, 5, 1, 8],
        [1, 1, 1],
        [2, 2, 2, 3],
        [-1, -2, -3, -4],
        [0, 1, 2, 3, 4]
    ]
    
    for testCase in testCases {
        print("Input: \(testCase) => Maximum Value: \(maximumValue(from: testCase))")
    }
    

결론

이번 강좌에서는 ‘수를 묶어서 최댓값 만들기’ 문제를 다뤄봤습니다. 문제를 해결하는 과정에서 수의 조합 방식의 중요성을 이해하고, 이를 통해 최적의 결과를 도출할 수 있었습니다. 코딩테스트에서 자주 출제되는 유사 문제를 풀어보며 스킬을 향상시킬 수 있을 것입니다. 앞으로도 다양한 알고리즘 문제를 해결하며 더 깊이 있는 이해를 쌓아가길 바랍니다.