Skip to main content

그리디_가장 큰 수

문제

note
  • 첫째 줄에 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 = map(int, input().split())

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

answer = []
# 카운트 변수 초기화
cnt = 0
for i in range(m):
# 최댓값 저장
max_num = max(l)
# 카운트가 k번 만큼 순회할 때, 가장 큰 수를 리스트에서 임시 삭제 후
# 두 번째로 큰 수를 answer 리스트에 추가
# 다시 가장 큰 수를 리스트에 추가하여 다음 카운트에 사용
if cnt == k:
l.remove(max_num)
answer.append(max(l))
l.append(max_num)
# 카운트 초기화
cnt = 0
else:
# 가장 큰 수 추가
answer.append(max_num)
cnt += 1

print(sum(answer))

동빈나 풀이

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)

동빈나 풀이2

# n, m, k = map(int, input().split())
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)