# 예제 1 : 재현이가 (3, 2, 2), (3)으로 총 2번에 걸쳐서 유제품을 사면 됨
# 예제 2 : 재현이가 (6, 4, 5), (5, 5, 5)로 총 2번에 걸쳐서 유제품을 사면 됨
첫 번째 시도
## 의사코드 ##
# 3개를 한 번에 산다면 그중에서 가장 싼 것은 무료로 지불하고 나머지 두 개의 제품 가격만 지불
# 한 번에 3개의 유제품을 사지 않는다면 할인 없이 정가를 지불
# 가격 리스트를 작은 값부터 오름차순 정렬
# 가격 리스트.sort()
# total = 0 # 비용
# while prices:
# # 가격 리스트의 길이를 3으로 나눈 몫이 1이상인 경우
# if (len(prices) // 3) >= 1:
# min_price = prices.pop(0) # 3개 중 가장 싼 값
# # total = total + 가격 리스트의 가장 왼쪽 가격 + 가격 리스트의 가장 오른쪽 가격
# total += (prices.pop(0) + prices.pop())
# # 가격 리스트의 길이를 3으로 나눈 몫이 1미만인 경우
# else:
# # total = total + 가격 리스트의 가장 왼쪽 가격
# total += prices.pop(0)
n = int(input())
prices = []
for _ in range(n):
price = int(input())
prices.append(price)
# 가격 리스트를 오름차순 정렬
prices.sort()
total = 0 # 비용
while prices:
# 가격 리스트의 길이를 3으로 나눈 몫이 1이상인 경우
if (len(prices) // 3) >= 1:
min_price = prices.pop(0) # 3개 중 가장 싼 값
# total = total + 가격 리스트의 가장 왼쪽 가격 + 가격 리스트의 가장 오른쪽 가격
total += (prices.pop(0) + prices.pop())
# 가격 리스트의 길이를 3으로 나눈 몫이 1미만인 경우
else:
# total = total + 가격 리스트의 가장 왼쪽 가격
total += prices.pop(0)
print(total)
-> 틀림
문제에서 설명된 예제 힌트를 보고 가격 리스트를 작은 값부터 오름차순 정렬해서 구하는 걸로 했더니 틀렸다.
## 의사코드 ##
# 3개를 한 번에 산다면 그중에서 가장 싼 것은 무료로 지불하고 나머지 두 개의 제품 가격만 지불
# -> 최소비용이 되려면 무료로 지불할 가장 싼 것이 최대한 비싼 물건이 되도록 해야 함
# 한 번에 3개의 유제품을 사지 않는다면 할인 없이 정가를 지불
# 가격 리스트를 큰 값부터 내림차순 정렬
# 가격 리스트.sort(reverse=True)
# min_prices = 0 # 무료로 지불할 가장 싼 가격들의 합
# # 내림차순으로 정렬된 가격 리스트에서 3의 배수 번째 가격을 더함
# for i in range(2, n, 3): # n = len(prices)
# min_prices += prices[i]
# # 최소 비용 = 전체 가격의 합 - 무료로 지불할 가장 싼 가격들의 합
# sum(prices) - min_prices
n = int(input())
prices = []
for _ in range(n):
prices.append(int(input()))
# 가격 리스트를 내림차순 정렬
prices.sort(reverse=True)
# 무료로 지불할 가장 싼 가격들의 합
min_prices = 0
# 내림차순으로 정렬된 가격 리스트에서 3의 배수 번째 가격을 더함
for i in range(2, n, 3): # n = len(prices)
min_prices += prices[i]
# 최소 비용 = 전체 가격의 합 - 무료로 지불할 가장 싼 가격들의 합
print(sum(prices) - min_prices)
-> 가격 리스트를 큰 값부터 내림차순 정렬하면 3의 배수 번째 가격들이 무료로 지불할 가장 싼 가격들이 됨
(최소 비용이 되려면 무료로 지불할 가장 싼 가격들이 최대한 비싼 금액이 되어야 하기 때문)
이 무료로 지불할 가장 싼 가격들의 합을 구해서 전체 가격의 합에서 빼준 값이 최소 비용
cf) 'for i in range(2, n, 3)'에서 n 대신 len(prices)를 사용하면 시간 초과 뜸