난이도🖤🤍🤍 | 풀이시간 30분 | 제한시간 1초 | 메모리제한 128MB | 2019국가 교육기관 코딩 테스트
왜 그리디인가?
큰 수를 최대한 많이 선택하므로
nmk = list(map(int,input().split()))
numbers = list(map(int,input().split()))
numbers.sort()
numbers.reverse()
bignum = 0
used = 0
big_idx = 0
for i in range(0, nmk[1]):
# greedy, 가장 큰 수를 가장 많이 사용한다
# 최대 사용 횟수 초과 시
if used >= nmk[2]:
big_idx = 1
used = 0
else:
# 현재 big_idx가 최대가 아니라면 다시 최대로 변경
# used 초기화
if big_idx != 0:
big_idx = 0
used = 0
bignum += numbers[big_idx]
used += 1
print(bignum)
# N, M, K를 공백으로 구분하여 입력받기
n, m, k = map(int, input().split())
# N개의 수를 공백으로 구분하여 입력받기
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): #가장 큰 수를 k번 더하기
if m == 0: # m이 0이라면 반복문 탈출
break
result += first
m -= 1 # 더할 때마다 1씩 빼기
if m == 0: # m이 0이라면 반복문 탈출
break
result += second # 두 번째로 큰 수를 한 번 더하기
m -= 1 # 더할 때마다 1씩 빼기
print(result) # 최종 답안 출력
🔹 왜 더 좋은 답안인가?
M의 크기가 100억 이상이라면 위 답안으로는 시간초과!😵
🔹반복되는 수열에 대해 파악해보자
input이 2 4 5 4 6 이고 m=8, k=3이라면
(6+6+6+5) + (6+6+6+5)
=> 즉, 6 6 6 5 가 반복된다.
# N, M, K를 공백을 기준으로 구분하여 입력 받기
n, m, k = map(int, input().split())
# N개의 수를 공백을 기준으로 구분하여 입력 받기
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) # 최종 답안 출력