본문 바로가기
Algorithm/Problem Solving

[Problem Solving] 큰 수의 법칙

by Kyunghoon Kim 2021. 1. 18.

그리디, 탐욕법

문제 : 큰 수의 법칙

  • 첫째 줄에 N(2 <= N <= 1,000), M(1 <= M <= 10,000), K(1 <= K <= 10,000)의 자연수가 주어지며, 각 자연수는 공백으로 구분한다.
  • 둘째 줄에 N개의 자연수가 주어진다. 각 자연수는 공백으로 구분한다. 단, 각각의 자연수는 1 이상 10,000 이하의 수로 주어진다.
  • 입력으로 주어지는 K는 항상 M보다 작거나 같다.
입력 예시 출력 예시
5 8 3
2 4 5 4 6
46

 

#  N : 배열의 크기, M : 숫자가 더해지는 횟수, K : 최대 연속 횟수
# 5 8 3
# 2 4 5 4 6
# 6 + 6 + 6 + 5 + 6 + 6 + 6 + 5 = 46

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

data.sort()

first = data[N - 1]
second = data[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

print(f"결과 : {result}")

 

위의 방법처럼 단순하게 계산을 할 수도 있지만 간단한 수학적 아이디어를 이용해 더 효율적으로 문제를 해결할 수도 있다.

 

# 5 9 3
# 2 4 5 4 6
# 6 + 6 + 6 + 5 + 6 + 6 + 6 + 5 + 6 = 46

# 반복되는 수열 : 6 + 6 + 6 + 5
# 반복되는 수열의 길이 : K + 1
# 반복되는 수열의 횟수 : int(M / (K + 1))
# 제일 큰 수의 반복 횟수 : int(M / (K + 1)) * K
# 나누어 떨어지지 않는 경우 : int(M % (K + 1))

N, M, K = map(int, input().split())
data = list(map(int, input().split()))

data.sort()

first = data[N - 1]
second = data[N - 2]

result = 0
count = 0   # 제일 큰 수의 반복 횟수

count += int(M / (K + 1) * K)
count += int(M % (K + 1))

result += count * first
result += (M - count) * second

print(f"합 : {result}")

'Algorithm > Problem Solving' 카테고리의 다른 글

[Problem Solving] 음료수 얼려 먹기  (0) 2021.02.04
[Problem Solving] 게임 개발  (0) 2021.02.02
[Problem Solving] 왕실의 나이트  (0) 2021.02.01
[Problem Solving] 상하좌우  (0) 2021.02.01
[Problem Solving] 거스름돈  (0) 2021.01.18

댓글