문제 정의
주어진 수의 배열에서 수를 묶어서 최댓값을 만드는 함수를 작성하세요. 이 문제에서 수를 묶는 방법은 각 수를 선택하거나, 두 개를 선택하여 더하고, 세 개 이상을 선택하여 곱할 수 있습니다. 최댓값을 만드는 방법을 고려하여 코드를 작성해야 합니다.
입력 및 출력 형식
입력
정수 N (1 ≤ N ≤ 1000)과 N개의 정수가 포함된 배열이 주어집니다.
출력
최댓값을 출력합니다.
예제
입력
5 1 2 3 4 5
출력
120
문제 접근 방법
이 문제를 해결하기 위해서는 수를 조합할 때, 특히 두 개 이상의 수를 곱하는 것이 최댓값을 증가시키는 데 큰 영향을 미친다는 점을 고려해야 합니다. 이에 따라 수의 배열을 정렬하고, 최댓값을 추적하여 최적의 조합을 찾아야 합니다. 기본적인 접근 방법은 다음과 같습니다:
- 배열을 오름차순으로 정렬합니다.
- 배열의 끝에서부터 하나씩 더하거나 곱하는 방식으로 최댓값을 계산합니다.
- 특히, 0 이상의 수가 연속해서 있을 때는 곱하는 것이 유리합니다.
- 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`를 정의하고 있습니다. 이 함수는 다음과 같은 작업을 수행합니다:
- 배열을 오름차순으로 정렬합니다.
- 배열의 끝에서 시작하여 두 개씩 곱하거나 한 개씩 더하는 방식으로 최대 값을 계산합니다.
- 최종적으로 계산된 최대 값을 반환합니다.
테스트 케이스
여러 가지 테스트 케이스를 통해 코드의 정확성을 확인해 보겠습니다.
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))") }
결론
이번 강좌에서는 ‘수를 묶어서 최댓값 만들기’ 문제를 다뤄봤습니다. 문제를 해결하는 과정에서 수의 조합 방식의 중요성을 이해하고, 이를 통해 최적의 결과를 도출할 수 있었습니다. 코딩테스트에서 자주 출제되는 유사 문제를 풀어보며 스킬을 향상시킬 수 있을 것입니다. 앞으로도 다양한 알고리즘 문제를 해결하며 더 깊이 있는 이해를 쌓아가길 바랍니다.