이코테) 큰 수의 법칙

min:D·2022년 6월 27일
0

알고리즘 공부

목록 보기
1/10

배열의 크기 N
숫자가 더해지는 횟수 M
배열의 특정한 인덱스에 해당하는 수가 연속해서 K번까지만 더해질 수 있음

내가 짠 코드

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

data = list(map(int, input().split()))

data.sort() # 정렬 함수는 작은 순서대로 정렬된다.
first = data[-1] # 제일 큰 숫자는 제일 뒤에 위치함
second = data[-2] # 두 번째로 큰 숫자는 끝에서 두 번째에 위치.

sum = 0

for i in range(0, m, k+1):
  for j in range(k):
    sum += first
  sum += second

print(sum)

효율적인 방법

  • 간단한 수학적 아이디어를 통해서 더 효율적으로 해결할 수 있다.
  • 반복되는 수열을 파악해야 한다.
  1. 가장 큰 수(first)가 K번 더해지고 두 번째로 큰 수(second)가 1번 더해지는 형식이 반복된다.
    수열 : first * K + second 따라서 반복되는 수열의 길이는 K+1 이 된다.
  2. 수열이 반복되는 횟수는 M / (K+1)의 몫이 된다.
  3. 위의 값에서 * K 하면 제일 큰 수가 반복되는 횟수가 된다.
  4. M / (K+1)의 나머지가 존재할 때는 그 만큼 제일 큰 수가 더 반복되는 것을 잊지 말아야 한다.
    \therefore 제일 큰 수가 반복되는 횟수 = int(M /(K+1)) * K + 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]

count = int(m / (k+1)) * k
count += m % (k+1)

result = 0
result += (count) * first
result += (m - count) * second

print(result)

0개의 댓글