문제 링크입니다: 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 |