본문 바로가기
코딩테스트/Codility

[C++ 풀이] Codility - Lessons 6, (Sorting) MaxProductOfThree

by Hwan2 2019. 8. 9.
반응형

이 문제는 Codility 사이트에서 확인하고 문제를 풀 수 있습니다.

https://www.codility.com/

 

 

문제.

 

 

 

 

설명

 

 

 

배열 A가 주어 집니다.

배열 A의 요소에는 -1,000 ~ 1,000의 정수가 있습니다.

 

배열 A의 요소중 3개를 곱했을 때 가장 큰 수를 return하는 문제입니다.

 

주의해야할 점은 총 3가지 입니다.

1. 모두 음수일 경우.

2. 음수 * 음수 = 양수 의 값이 양수 * 양수보다 클 경우.

3. 음수 * 음수의 곱이 양수 * 양수 의 곱보다 작을 경우.

 

 

 

애초에 Codility의 Lessons부분이 Sorting으로 되어 있는데.....

저는 그냥 무식한 방법으로 풀었습니다. ㅡㅡ.

 

 

 

결과

 

// you can use includes, for example:
// #include <algorithm>

// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;

void sort_Arr(int* arr){
    for(int i = 0; i < 2; i++)
        if(arr[i] > arr[i + 1])
            arr[i] ^= arr[i + 1] ^= arr[i] ^= arr[i + 1];
    
    if(arr[0] > arr[1])
        arr[0] ^= arr[1] ^= arr[0] ^= arr[1];
}

int solution(vector<int> &A) {
    // write your code in C++14 (g++ 6.2.0)
    int arr[3] = ;
    int M_min = A.at(0), M_max = A.at(1);
    int count = 0;
    
    if(A.size() == 3)
        return A.at(0) * A.at(1) * A.at(2);
    else
        sort_Arr(arr);
    
    if(M_max > M_min)
        M_min ^= M_max ^= M_min ^= M_max; 
        
    if(M_min > A.at(2))
        M_min = A.at(2);
    
    if(M_max > M_min)
        M_min ^= M_max ^= M_min ^= M_max; 
        

    for(int i = 3; i < A.size(); i++){
        if(arr[0] < A.at(i)){
            arr[0] = A.at(i);
            sort_Arr(arr);
        }

        if(M_min > A.at(i)){
            M_min = A.at(i);

            if(M_min < M_max)
                M_min ^= M_max ^= M_min ^= M_max;
        }
    }

    for(int i = 0; i < A.size(); i++)
        if(A.at(i) < 0)
            count++;
     
    if(M_min * M_max > arr[0] * arr[1])
        if(count == A.size())
            return arr[0] * arr[1] * arr[2];
        else
            return M_min * M_max * arr[2];
    else
        return arr[0] * arr[1] * arr[2];
}

 

 

 

https://app.codility.com/demo/results/trainingX83FEU-ZXV/

 

 

 

 

꼴보기 싫어지는 코드내요..... 다른사람 풀이를 보고 정렬이 이 문제의 열쇠임을 깨닫고 

해탈한 마음으로 다시 코드를 짯습니다.....

 

// you can use includes, for example:
#include <algorithm>
using namespace std;
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;

int solution(vector<int> &A) {
    // write your code in C++14 (g++ 6.2.0)
    int index = A.size() - 1;
    int P_max, M_max;
    
    sort(A.begin(), A.end());
    
    P_max = A.at(index - 1) * A.at(index - 2);
    M_max = A.at(0) * A.at(1);

    if(M_max > P_max){
        if(A.at(index) < 0)
            return P_max * A.at(index);
        else
            return M_max * A.at(index);
    }else
        return P_max * A.at(index);

}
​

 

https://app.codility.com/demo/results/trainingDMJ333-Y3C/

반응형

댓글


스킨편집 -> html 편집에서