알고리즘/BOJ

백준 14753번 MultiMax

꾸준함. 2018. 5. 19. 14:22

문제 링크입니다: https://www.acmicpc.net/problem/14753


개인적으로 문제 의역

숫자가 적혀있는 n개의 카드가 주어졌고 두개 이상의 카드는 똑같은 숫자가 적혀있을 수 있다. 이 카드들로 두개 혹은 세개를선택해 곱이 최대가 되도록 해라. 다음의 6개 카드로 예를 들겠다: 5, 10, -2, 3, 5 그리고 2. 만약 5, 10, 5를 선택한다면 결과로 250이 나올 것이고 250이 최대가 될 것이다. 4개 카드로 또 다른 예를 들겠다: 10, 0, -5, 2가 주어졌다고 하자. 10과 2 두개의 카드를 고르면 결과로 20이 나올 것이고 20이 최대가 될 것이다.

n개의 카드가 주어졌을 때, 2개 혹은 3개의 카드를 선택해 최대의 결과를 출력해라.


복잡하게 생각할 것 없이 배열을 정렬한 뒤 총 7개의 경우의 수를 고려해주면 됩니다.

카드 2개를 고를 때

1. 첫번째로 큰 수, 두번째로 큰 수

2. 제일 작은 수, 두번째로 작은 수

3. 제일 작은 수, 제일 큰 수(둘 다 음수일 경우를 고려해)

카드 3개를 고를 때

1. 첫번째로 큰 수, 두번째로 큰 수, 세번째로 큰 수

2. 제일 작은 수, 첫번째로 큰 수, 두번째로 큰 수

3. 제일 작은 수, 두번째로 작은 수, 제일 큰 수

4. 제일 작은 수, 두번째로 작은 수, 세번째로 작은 수


#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

 

const int MAX = 10000;

 

int N;

vector<int> v;

 

int maxProduct(void)

{

        //두개

        int case1 = v[0] * v[N - 1]; //양 끝

        int case2 = v[N - 1] * v[N - 2]; //정렬했을 때 제일 큰 수 두개

        int case3 = v[0] * v[1]; //정렬했을 때 제일 작은 수 두개

        //세개

        int case4 = v[N - 1] * v[N - 2] * v[N - 3]; //정렬했을 때 큰 수 세개

        int case5 = v[0] * v[1] * v[2]; //정렬했을 때 작은 수 세개

        int case6 = v[0] * v[N - 1] * v[N - 2]; //제일 작은 수, 큰 수 두개

        int case7 = v[0] * v[1] * v[N - 1]; //작은 수 두개, 제일 큰 수

        return max({ case1, case2, case3, case4, case5, case6, case7});

}

 

int main(void)

{

        cin >> N;

 

        for (int i = 0; i < N; i++)

        {

                 int temp;

                 cin >> temp;

                 v.push_back(temp);

        }

 

        sort(v.begin(), v.end());

       

        cout << maxProduct() << endl;

        return 0;

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~ 

 


반응형

'알고리즘 > BOJ' 카테고리의 다른 글

백준 1753번 최단경로  (4) 2018.05.19
백준 14954번 Happy Number  (2) 2018.05.19
백준 4963번 섬의 개수  (0) 2018.05.17
백준 1065번 한수  (0) 2018.05.16
백준 1660번 캡틴 이다솜  (4) 2018.05.15