본문 바로가기

백준 write-up/정렬 & 그리디

[백준] 카우버거 : 15720번 - Python

728x90
반응형

https://www.acmicpc.net/problem/15720

 

15720번: 카우버거

첫째 줄에는 주문한 버거의 개수 B, 사이드 메뉴의 개수 C, 음료의 개수 D가 공백을 사이에 두고 순서대로 주어진다. (1 ≤ B, C, D ≤ 1,000) 둘째 줄에는 각 버거의 가격이 공백을 사이에 두고 주어진

www.acmicpc.net

 

 

 

문제의 접근 방법

 

- 버거의 개수, 사이드 메뉴의 개수, 음료의 개수를 모두 내림차순으로 정렬

- 세트 할인을 받을 수 있는 최소 쌍의 개수를 찾기

 

 

 

내가 막혔던 부분

 

할인을 받을 수 있게 구성할 수 있는 세트의 개수를 어떻게 계산해야 할 지 몰라서 반복문의 범위를 정하지 못함.

 

 

 

문제 풀이 방법

 

(1) 버거의 개수(b), 사이드 메뉴의 개수(c), 음료의 개수(d)를 입력 받기

(2) 버거의 가격들(bp), 사이드 메뉴의 가격들(cp), 음료의 가격들(dp)를 입력받아서 리스트로 저장한 후 내림차순 정렬하기

(3) 세트 할인이 적용되기 전 가격을 total에 저장하기

(4) 세트 할인을 받을 수 있는 최소 쌍의 개수를 찾기 위해 맨 처음에 입력 받았던 b,c,d값 중 가장 작은 값을 찾아 minValue에 저장하기

(5) 할인을 받을 수 있는 최소 쌍의 개수(minValue)만큼 반복문을 돌려 최소 비용을 의미하는 cost에 아까 내림차순 정렬을 했던 bp,cp,dp의 0번째 인덱스 값을 더해 0.9를 곱해주기(10프로 할인) + cost에 합을 누적하여 저장하기

(6) 그런 후 방금 계산했던 0번째 인덱스 값들을 다 pop(삭제) 해주기 (그 다음으로 큰 0번째 인덱스를 또 계산하기 위함)

(7) (5)~(6) 과정 이후, 세트 할인 구성품에 적용되지 않아서 그대로 남아있는 bp,cp,dp 안의 값들을 그 리스트들의 길이만큼의 반복문을 돌려서 cost에 누적해서 저장하기

(8) 초기 가격 total과 세트 할인이 적용된 후의 최소 가격 cost를 출력하기!

 

 

 

소스코드

b,c,d = map(int, input().split())

bp = sorted(list(map(int, input().split())), reverse=True)
cp = sorted(list(map(int, input().split())), reverse=True)
dp = sorted(list(map(int, input().split())), reverse=True)

total = sum(bp) + sum(cp) + sum(dp)

minValue = min(b,c,d)

cost = 0
for i in range(minValue):
    cost += (bp[0] + cp[0] + dp[0]) * 0.9
    bp.pop(0)
    cp.pop(0)
    dp.pop(0)

for i in range(len(bp)):
    cost += bp[i]

for i in range(len(cp)):
    cost += cp[i]

for i in range(len(dp)):
    cost += dp[i]

print(total)
print(int(cost))
728x90
반응형