Algorithm

큰 수의 법칙 (python)

salmon16 2021. 4. 15. 12:07

문제

첫째 줄에 N M K 가 주어지고 둘째 줄에 N개의 자연수가 주어진다.

N개의 자연수 배열중 M개로 만들 수 있는 가장 큰 수를 만들어서 출력하라 각 배열의 값은 반복 가능하고

같은 인덱스는 K번 초과해서 연속해서 나오면 안 된다 같은 수라도 인덱스가 다르면 연속하여 놓을 수 있다

예를 들어 3, 4, 3, 4, 3 이면 인덱스 1번과 3번은 다른 수이므로 정답은 4 * M가 될 것이다.

풀이 방법

배열을 정렬을 해서 가장 큰 수와 두번째로 큰 수를 결정한다 만약 가장 큰 수가 2개 이상이어도 상관없이 진행

그런 후 가장 큰 수를 만드는 패턴을 보면 K개의 가장 큰 수가 연속해서 나오고 두번 째로 큰 수가 한 번 나오고

다시 가장 큰 수가 k번 나오는 식으로 반복 되야 가장 큰 수를 만들 수 있다.

그러므로 가장 큰 수가 더해지는 횟수는 M / (k+1) * k + M % (k + 1) 이 된다. M % (k + 1)은 나누어 떨어지지 않을 때

남은 부분은 가장 큰 수로 채워주면 되기 때문이다 

그럼 M에서 큰 수가 더해지는 횟수를 빼면 두번 째로 큰 수가 더해지는 횟수가 된다

 

n, m, k = map(int, input().split())
data = list(map(int, input().split()))

data.sort()
max_num = data[n-1]
second_num = data[n-2]

#가장 큰 수가 더해지는 횟수 계산
count = m // (k+1) *k + m % (k+1)

ans = count * max_num + (m - count) * second_num
print(ans)