Algorithm/greedy

[알고리즘 문제] - C++ 그리디 알고리즘 문제 : 큰 수의 법칙

낭강 2020. 10. 29. 18:23

입력 조건 :  N , M, K

N=배열 개수 M=몇 번 더할 수 있는지 K=중복사용

입력 예시 : 5 8 3 

               2 4 5 4 6

출력 예시 : 46

배열에 숫자들을 입력받은 후, 이 숫자들을 이용하여 가장 큰 합을 만들어라..


즉, 가장 큰수와 그다음 큰수를 이용하여 해결 할 수 있는 문제로 그리디 알고리즘을 적용하는 것 같다.

나동빈님의 책에는 파이썬 코드로 작성되어 있으며, 저는 C++로 하나씩 문제를 해결하여 블로그에 올려볼 생각입니다.

알고리즘 초보분들 같이 문제들을 풀어보아요! 

int n, m, k, sum = 0;
cin >> n>>m>>k;
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
sort(arr, arr + n);
for (int i = 0; i < m; i++) {
if (i == 0) {
sum += arr[n - 1];
}
else if (i % k == 0) {
sum += arr[n - 2];
}
else {
sum += arr[n - 1];
}
}
cout << sum;

핵심 코드부분은 입력받은 배열을 정렬 후, 반복문과 조건문을 이용하여 쉽게 해결할 수 있습니다.


수학적인 방법으로 접근을 해보면, 6+6+6+5 / 6+6+6+5 이런식으로 반복이 되는 것을 볼 수 있다.

배열의 n의 값이 늘어나게 되면 시간초과에러가 난다고 하는데, 시간초과가 날지는 모르겠네요.

아무튼 다시 코드를 짜보자면

int n, m, k, sum = 0;
cin >> n>>m>>k;
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
sort(arr, arr + n);
sum = arr[n - 1] * (m / (k + 1)) * k + arr[n - 2] * (m / (k + 1));
sum += (m % (k + 1)) * k * arr[n - 1];
cout << sum;