[이코테] 그리디 알고리즘-큰 수의 법칙

장우솔·2023년 2월 13일
0

알고리즘

목록 보기
4/21
post-custom-banner

큰 수의 법칙

큰 수의 법칙이란 다양한 수로 이루어진 배열이 있을 때 주어진 수들을 M번 더하여 가장 큰 수를 만드는 법칙이다.
단, 배열의 특정한 인덱스에 해당하는 수가 연속해서 K번을 초과해 더할 수는 없다.

입력
배열크기, 숫자 더해지는 횟수, 반복가능횟수 주어질 때 합 구하기(n,m,k)

출력
큰 수의 법칙에 따라 더해진 답

예시

순서대로 2, 4, 5, 4, 6으로 이루어진 배열이 있을 때 M=8, K=3이라고 가정하자. 특정한 인덱스의 수를 연속해서 3번까지 더할 수 있으므로 큰 수의 법칙에 따라 결과는 6+6+6+5+6+6+6+5=46이 된다.
다른 예시로 3, 4, 3, 4, 3으로 이루어진 배열이 있을 때 M=7, K=2라고 가정하면, 결과는 4+4+4+4+4+4+4=28이 된다.

해결 아이디어

가장 큰 수를 k번 더하고 두번째로 큰 수를 한번 더하는 연산 반복

# 방법1

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
while True:
  for i in range(k): #k만큼 더하고
    result+=first
    m-=1
    if m==0:
      break
  result+=second # 한번 더해!
  m-=1
  if m==0:
    break
print(result)
# 숫자가 클 때 사용할 수 있는 방법2

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
# 가장큰수가 더해지는 횟수 계산
cnt=(m/(k+1))*k
cnt+=m%(k+1)

result=0
result+=cnt*first
result+=(m-cnt)*second
profile
공부한 것들을 정리하는 블로그
post-custom-banner

0개의 댓글