[HR] : Greedy Florist ★

yozzum·2022년 7월 11일
0

https://www.hackerrank.com/challenges/greedy-florist/problem?isFullScreen=true

문제 설명

  • c에 있는 element들은 flower들이고, 가격으로 표시되어있다. c = [2,5,6]이라면, 2달러짜리 꽃, 5달러짜리 꽃, 6달러짜리 꽃이 있는 것이다. 여러 사람들에 의해 꽃들이 적어도 한번씩 구매되도록 할 때, 전체 금액이 최소가 되도록 해라!

  • len(c)는 구매할 꽃의 개수가 된다.

  • k는 사람 수이다.

가격 정책 개념

  • 같은 사람이 n 번째 꽃을 구매 할때는 n+1 배의 가격을 지불해야한다.

  • 따라서 최대한 많은 사람들이 꽃을 사고,

  • 가장 높은 가격의 꽃부터 구매해야 비용이 최소화 된다.

  • c = [1,2,3,4], k=3 인 예제를 보면, 전체 꽃에 대해 cnt와 i 가 사람 수만큼 loop를 돌도록 해야한다.

c.pop 4 3 2 1
cnt   0 0 0 1
i     0 1 2 0

내가 짠 코드

def getMinimumCost(k, c):
    c = sorted(c)
    cnt = 0
    cost = 0
    while len(c) > 0:
        for i in range(k):
            if len(c) > 0:
                price = c.pop()
                cost += ((cnt+1) * price)
        cnt += 1
    return cost

개선 코드

def getMinimumCost(k, c):
    cost = 0
    for idx, price in enumerate(sorted(c, reverse=True)):
        # print(idx, idx%k, price)
        cost += (idx//k + 1) * price
    return cost
profile
yozzum

0개의 댓글