스파르타 코딩 클럽 - 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: )로 배열에서 내가 원하는 값을 삭제한다.


 😼 GitHub