큰 수의 법칙

이동욱

2021/08/26

Categories: 알고리즘

문제 - 큰 수의 법칙


제한 사항


아이디어


반복문

  1. 정렬을 하여 가장 큰 수와 그 다음으로 큰 수를 순서대로 구한다.
  2. 크게 M번 만큼 순회를 한다.
  3. K번 만큼 개수를 세어서 만약 K번 만큼 수행하였을 때 그 다음 큰수로 변경하여 한번 더하는 것을 M번이 끝날 때까지 반복한다.

나누기

  1. 정렬을 하여 가장 큰 수와 그 다음으로 큰 수를 구한다.
  2. 크게 M 번만큼 반복을 한다.
  3. 증가하는 요소를 K로 나눈 나머지가 0으로 나누어 떨어지면 그 다움으로 큰 수로 더한다.

반복되는 수열 파악

  1. 가장 큰 수와 두 번째로 큰 수가 더해질 때는 특정한 수열 형태로 일정하게 반복해서 더해진다.
  2. M을 (K + 1)로 나눈 몫 만큼 반복이 되어지며 K를 곱하면 나누어 떨어질 때 가장 큰수를 곱하는 경우이다., 여기에 일정하게 나누어 떨어지지 않는 경우도 있으므로 M을 (K + 1)로 나눈 나머지를 더해주면 된다.
  3. 총 수행할 개수 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