문제 - 큰 수의 법칙
-
다양한 수로 이루어진 배열이 있을 때 주어진 수들을 M번 더하여 가장 큰 수를 만드는 것이다.
-
단 배열의 특정한 인덱스에 해당하는 수가 연속해서 K번을 초과해서 더해질 수가 없는 것 이 특징이다.
-
예를 들어 순서대로 2, 4, 5, 4, 6 으로 이루어진 배열이 있을 때 M이 8이고 K가 3이라고 가정하자. 이 경우에 특정한 인덱스의 수가 연속해서 세 번까지만 더해질 수 있으므로 큰 수의 법칙에 따른 결과는 6 + 6 + 6 + 5 + 6 + 6 + 6 + 5인 46이 된다.
제한 사항
- 특정 수가 K 번을 초과해서 더해질 수 없다.
- 첫째 줄에 N(2 <= N < 1000), M (1 <= M <= 10,000), K (1 <= K <= 10000)의 자연수가 주어진다.
- 둘째 줄에 N개의 자연수가 주어진다. 각 자연수는 공백으로 구분한다. 각각의 자연수는 1 이상 ~ 10,000 이하의 수로 주어진다.
- 입력으로 주어지는 K는 항상 M보다 작거나 같다.
아이디어
반복문
- 정렬을 하여 가장 큰 수와 그 다음으로 큰 수를 순서대로 구한다.
- 크게 M번 만큼 순회를 한다.
- K번 만큼 개수를 세어서 만약 K번 만큼 수행하였을 때 그 다음 큰수로 변경하여 한번 더하는 것을 M번이 끝날 때까지 반복한다.
- 시간 복잡도 : O(N)
나누기
- 정렬을 하여 가장 큰 수와 그 다음으로 큰 수를 구한다.
- 크게 M 번만큼 반복을 한다.
- 증가하는 요소를 K로 나눈 나머지가 0으로 나누어 떨어지면 그 다움으로 큰 수로 더한다.
반복되는 수열 파악
- 가장 큰 수와 두 번째로 큰 수가 더해질 때는 특정한 수열 형태로 일정하게 반복해서 더해진다.
- M을 (K + 1)로 나눈 몫 만큼 반복이 되어지며 K를 곱하면 나누어 떨어질 때 가장 큰수를 곱하는 경우이다., 여기에 일정하게 나누어 떨어지지 않는 경우도 있으므로 M을 (K + 1)로 나눈 나머지를 더해주면 된다.
- 총 수행할 개수 M에서 가장 큰 수를 더하는 횟수를 빼면 두번째로 큰 숫자를 더하는 숫자가 나온다.
코드
from typing import List
def solution(n: int, m: int, k: int, lists: List[int]) -> int:
lists.sort(reverse=True)
first, second = lists[0], lists[1]
tot = 0
cnt = 0
for i in range(m):
cnt += 1
if cnt == k:
tot += second
cnt = 0
else:
tot += first
return tot
def solution1(n: int, m: int, k: int, arrays: List[int]) -> int:
arrays.sort(reverse=True)
first, second = arrays[0], arrays[1]
tot = 0
for i in range(1, m + 1):
if i % (k + 1) == 0:
tot += second
else:
tot += first
return tot
def solution2(n: int, m: int, k: int, arrays: List[int]) -> int:
arrays.sort()
first = arrays[n - 1]
second = arrays[n - 2]
result = 0
while True:
for i in range(k):
if m == 0:
break
result += first
m -= 1
if m == 0:
break
result += second
m -= 1
return result
def solution3(n: int, m: int, k: int, arrays: List[int]) -> int:
arrays.sort()
first = arrays[n - 1]
second = arrays[n - 2]
count = int(m / (k + 1)) * k
count += m % (k + 1)
result = 0
result += (count) * first
result += (m - count) * second
if __name__ == "__main__":
n, m, k = map(int, input().split())
lists = list(map(int, input().split()))
print(solution1(n, m, k, lists))
참고 문헌
>> Home