코딩테스트

[Swift 알고리즘] Codility - MaxProductOfThree

유정주 2022. 6. 19. 08:55
반응형

안녕하세요. 개발 중인 정주입니다.

 

오늘은 "Codility - MaxProductOfThree" 문제를 풀었습니다.

 

Github

 

GitHub - jeongju9216/SwiftAlgorithm: 스위프트 알고리즘

스위프트 알고리즘. Contribute to jeongju9216/SwiftAlgorithm development by creating an account on GitHub.

github.com

 

문제 링크

 

MaxProductOfThree coding task - Learn to Code - Codility

Maximize A[P] * A[Q] * A[R] for any triplet (P, Q, R).

app.codility.com

 

풀이

이번 문제는 배열에서 랜덤한 세 개의 수를 곱했을 때의 최댓값을 구하는 문제입니다.

평균값을 구하는 문제처럼 어떤 수학적 원리가 있나? 했지만

정렬을 이용한 곱 문제였습니다.

 

큰 수끼리 곱하면 곱이 커진다는 원리를 이용해 풀었습니다.

이번 문제는 음수도 input 범위에 속하기 때문에 함께 고려해줘야 합니다.

 

배열은 sorted( )를 이용하면 O(N log N)으로 정렬할 수 있습니다.  

그 다음 양수곱 중 최대값인 맨 뒤 세 개의 곱을 구합니다.

맨 앞 두 개 원소의 곱이 양수라면 맨 뒤 원소를 곱해주고 최대값을 return 합니다.

맨 앞 두 개 원소의 곱이 음수라면 맨 뒤 세 개의 곱을 return 합니다.

 

코드를 보시면 더 심플하게 이해가 되실겁니다.

 

감사합니다!

 

전체 코드

더보기
import Foundation
import Glibc

// you can write to stdout for debugging purposes, e.g.
// print("this is a debug message")

public func solution(_ A : inout [Int]) -> Int {
    // write your code in Swift 4.2.1 (Linux)
    //non-empty array
    //swift sort = O(N log N)

    let sortedA = A.sorted()
    let countA = A.count

    let backProduct = sortedA[countA-1] * sortedA[countA-2] * sortedA[countA-3]

    var frontProduct = sortedA[0] * sortedA[1]
    if frontProduct < 0 {
        return backProduct
    } else {
        frontProduct *= sortedA[countA-1]
        return max(frontProduct, backProduct)
    }
}

아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

반응형