스파르타 코딩 클럽 - iOS 스타터 6기/알고리즘 코드카타
27. 스파르타 코딩 클럽 - 5월 7일 코딩테스트 연습 (코드카타)
seongpil Heo
2025. 5. 7. 14:29
❓ 오늘의 문제
1. 최댓값 만들기(1)
- 정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return 하도록 solution 함수를 완성해 주세요.
나의 정답 코드
import Foundation
func solution(_ numbers:[Int]) -> Int {
var numbers = numbers
let max1 = numbers.max() ?? 0
if let index = numbers.firstIndex(of: max1) {
numbers.remove(at: index)
}
let max2 = numbers.max() ?? 0
return max1 * max2
}
✓ TIL
1. numbers 배열이 let 상수로 선언되었기 때문에 내부에서 .remove(at:)를 사용할 수 없다.
처음 매개변수로 주어지는 numbers 배열은 let 상수로 선언되었기 때문에 solution 함수 내부에서 remove와 같은 수정(mutating) 연산을 할 수 없기 때문에 오류가 발생한다.
var numbers = numbers
따라서 배열의 복사본을 만들고 그 복사본을 수정하는 식으로 사용해야 한다.
2. numbers.max()는 옵셔널 값
numbers.max()가 옵셔널(Int?)을 반환하는 이유는 배열이 비어 있을 수도 있기 때문이다.
let numbers: [Int] = []
let maxValue = numbers.max()
// maxValue는 nil이 됨
따라서 max() 함수를 사용하기 위해서는 ?? 0을 사용하여 빈 배열일 때 0을 return 한다던가
옵셔널 바인딩을 통해 안전하게 처리 후 사용해야 한다.
// 방법 1
let max1 = numbers.max() ?? 0
// 방법 2
guard let max2 = numbers.max() else { return 0 }
3. 배열에서 원하는 값 삭제하기
if let index = numbers.firstIndex(of: max1) {
numbers.remove(at: index)
}
해당 예시는 배열에서 max1 값을 찾고 그 값을 배열에서 삭제시키는 방법이다.
배열에서 먼저 .firstIndex(of: )로 max1 값과 동일한 값이 있는 인덱스를 찾고,
그 인덱스를 이용해서 .remove(at: )로 배열에서 내가 원하는 값을 삭제한다.