Algorithm/Greedy

[Python] 큰 수의 법칙(그리디)

코딩쪼앙 2023. 1. 4. 21:34

문제 

  • 다양한 수로 이루어진 배열이 있을 때 주어진 수들을 M번 더하여 가장 큰 수 만들기
  • 배열의 특정한 인덱스(번호)에 해당하는 수가 연속해서 k번을 초과하여 더해질 수 없다
  • 서로 다른 인덱스에 해당하는 수가 같은 경우에도 서로 다른 것으로 간주

입력

  • 첫째줄에 N (2 <= N <= 1,000), M (1 <= M <= 10,000), K (1 <= K < 10,000) 의 자연수가 주어진다
  • 둘째 줄에 N개의 자연수가 주어진다. 각 자연수는 1이상 10,000이하의 수로 주어진다
  • 입력으로 주어지는 K는 항상 M보다 작거나 같다 

출력

  • 첫째 줄에 동빈이의 큰 수의 법칙에 따라 더해진 값을 출력한다

문제 풀이 1

  • 문제에서 필요한 값은 첫 번째로 큰 수와 두 번째로 큰 수이다
  • m의 값이 0이 될 때 까지 첫 번째로 큰 수를 K번 더한 후 두 번째로 큰 수를 한 번 더한다
  • while문과 for문 안에서 m의 값이 0이 되는 경우를 고려하여 break도 작성
  • 연산 결과를 출력한다

코드

n, m, k = map(int,input().split())
data = list(map(int,input().split()))
data.sort(reverse=True)
first = data[0]
second = data[1]

result = 0
# m이 될 때 까지 k번씩 계속 더하기
while m > 0 :
    for i in range(k):
        result += first
        m -= 1
        if m < 0:
            break

    if m < 0:
        break
    result += second
    m -= 1
    b 
print(result)

문제풀이 2

  • 반복되는 수열의 길이는 K + 1 (큰 수 K만큼 더한 후, 두 번째로 큰 수를 한 번 더하기 때문)
  • 이 때  M // 수열의 길이는 반복되는 수열의 횟수
  • 반복되는 수열의 횟수 * K 는 가장 큰 수의 횟수
  • M이 (K + 1)로 나누어 떨어지지 않는다면 나머지의 크기만큼 가장 큰 수의 횟수를 더해준다
  • 마지막으로 전체 연산의 횟수 M에서 가장 큰수의 횟수를 빼면 두 번째로 큰 수의 횟수
  • 변수에 가장 큰 수와 두 번째로 큰수를 더한 후 값을 출력

코드

# 배열의 길이, 연산 횟수, 연속될 수 있는 경우
n, m, k = map(int,input().split())
data = list(map(int,input().split()))
data.sort()
first = data[n - 1]
second = data[n - 2]

# 가장 큰 수의 개수
count = int(m // (k + 1)) * k
count += m % (k + 1)

result = count * first
# 두 번째로 큰 수의 횟수는 전체연산횟수 - 가장 큰 수의 횟수
result += (m - count) * second
print(result)

'Algorithm > Greedy' 카테고리의 다른 글

[Python] 문자열 뒤집기  (0) 2023.01.10
[Python] 곱하기 혹은 더하기  (0) 2023.01.09
[Python] 모험가 길드  (0) 2023.01.09
[Python] 1이 될 때까지(그리디)  (0) 2023.01.06
[Python] 숫자 카드 게임(그리디)  (0) 2023.01.06