https://www.acmicpc.net/problem/15720
문제의 접근 방법
- 버거의 개수, 사이드 메뉴의 개수, 음료의 개수를 모두 내림차순으로 정렬
- 세트 할인을 받을 수 있는 최소 쌍의 개수를 찾기
내가 막혔던 부분
할인을 받을 수 있게 구성할 수 있는 세트의 개수를 어떻게 계산해야 할 지 몰라서 반복문의 범위를 정하지 못함.
문제 풀이 방법
(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))
'백준 write-up > 정렬 & 그리디' 카테고리의 다른 글
[백준] 설탕 배달 : 2839번 - Python (0) | 2021.08.04 |
---|---|
[백준] 키보드 이벤트 : 17254번 - Python (0) | 2021.08.03 |
[백준] 접두사 찾기 : 14426번 - Python (0) | 2021.08.01 |
[백준] 카드 바꿔치기 : 18766번 - Python (0) | 2021.08.01 |
[백준] 멀티버스 Ⅰ : 20291번 - Python (0) | 2021.07.30 |