본문 바로가기
나동빈 with 파이썬/실전문제 풀이

[Ch.3 - 그리디] 큰 수의 법칙

by yewonnie 2022. 1. 28.

My code

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

a.sort()
a1 = a[n-1] #첫 번째로 큰 수
a2 = a[n-2] #두 번째로 큰 수

sum = 0
count = 0
while True:
    for i in range(k):
        if count==m:
            break
        sum += a1
        count += 1
    if count==m:
        break
    sum += a2
    count += 1
    
print(sum)

Answer 1

n,m,k = map(int,input().split())
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):
        if m == 0:
            break
        result += first
        m -= 1
    
    if m == 0:
        break
    result += second
    m -= 1
                    
print(result)

Answer 2

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)

Code Review

-My code
큰 수의 법칙은 가장 큰 수와 두 번째로 큰 수만 알면 해결 할 수 있는 문제 입니다. 가장 큰 수를 k 번 더하고 두 번째로 큰 수를 한 번 더하는 연산을 반복하면 됩니다. 따라서 sort 함수를 이용해 입력 받은 정수들을 오름차순으로 먼저 정렬해주고 n-1 번째와 n-2 번째를 각각 변수에 저장해주었습니다. 가장 큰 수를 k 번 더해주고 두 번재로 큰 수를 한 번 더해주도록 해주었고 더할 때마다 count 를 1씩 증가시켜 주어 얼만큼 더해주었는지 세주었습니다. 만약 이 카운트가 m 과 같아졌을 때 반복문을 빠져나와 지금까지 더한 결과 sum 을 출력해주도록 해주었습니다.
*맨 처음 반복문의 위치를 count 연산 아래에 해주었는데 그렇게 하면 반복문을 빠져나가지 못하고 무한 루프를 돌게 되어 문제가 발생하였습니다.*

 

 

 

댓글