풀이법
1) 그리디 접근법을 사용하면 쉽게 풀 수 있는 문제이다.
2) 내림차순으로 배열을 정렬한 후 하나씩 넣어보며 최대값을 비교한다면 어렵지 않게 풀 수 있을 것이다.
#include <algorithm>
using namespace std;
int n;
vector<int> arr;
long long ans=0;
bool compare(int a, int b)
{
if (a <= b)
{
return false;
}
else
return true;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for (int i = 0; i < n; i++)
{
int a;
cin >> a;
arr.push_back(a);
}
sort(arr.begin(), arr.end(),compare);
for (int i = 0; i < n; i++)
{
int temp;
temp = arr[i] * (i + 1);
if (ans <= temp)
{
ans = temp;
}
}
cout << ans<<"\n";
}
한계점 및 개선사항 (+주의사항)
main함수에서 최대값을 찾는 for문에 if(ans>temp) break를 넣게 되면 틀리는 부분을 신경써야 한다.
[15, 10, 7, 5, 5]가 그 반례이다.
올려둔 source 코드에 기반하면
15->20->21->pass->25가 되어 값이 25가 출력되어 정답임을 알 수 있다.
허나 ans>temp일 경우 break를 해버리면
15->20->21에서 break가 되어 잘못된 값을 출력할 수 있으니 주의해야 한다.
github.com/pearlcrum/CodingTest/tree/main
'Coding_Test_C++' 카테고리의 다른 글
BaekJoon 12865번: 평범한 배낭 (0) | 2021.04.10 |
---|---|
BaekJoon 1026번: 보물 (0) | 2021.04.09 |
BaekJoon 1074번: Z (0) | 2021.04.08 |
BaekJoon 2447번: 별 찍기 - 10 (0) | 2021.04.08 |
BaekJoon 11729번: 하노이 탑 이동 순서 (0) | 2021.04.08 |