728x90
반응형
https://www.acmicpc.net/problem/2258
2258번: 정육점
첫째 줄에 두 정수 N(1 ≤ N ≤ 100,000), M(1 ≤ M ≤ 2,147,483,647)이 주어진다. N은 덩어리의 개수를 의미하고, M은 은혜가 필요한 고기의 양이다. 다음 N개의 줄에는 각 고기 덩어리의 무게와 가격을 나
www.acmicpc.net
문제 해결
- 특이한 것이 어떤 고기의 가격보다 싼 고기들이 공짜라는 점이다.
- 그러므로 가격이 싼 것부더 정렬을 하여 for 문을 통해 가격을 정한 다음 그 이전의 고기의 무게들을 더해 원하는 고기량보다 큰 것들을 종합하여 가장 작은 가격이 정답이 된다.
- 가격 오름차순으로 정렬했기 때문에 가능한 답이 나오면 그것이 정답이라고 생각할 수 있지만 이전과 동일한 가격이여서 앞에 것을 공짜로 못얻어 비싸지는 경우가 있다. ex) 4, 4, 6 .. 그러면 4원 한번 계산 후 질량이 모자라 다음 4원 계산 때 넘었는데 이 때 가격은 8원으로 뒤에 6원보다 비싸다.
CODE
import sys
INF = sys.maxsize
n, m = map(int, input().split())
memo = []
total = 0
dp = [0]*(n+1)
for _ in range(n):
a, b = map(int, input().split())
memo.append((a,b))
total += a
if total < m:
print(-1)
else:
memo.sort(key=lambda x:(x[1],-x[0]) ) #가격은 싼것부터, 무게는 큰 것 부터
min_price = INF
cnt = 1
for i in range(len(memo)):
price = memo[i][1] # 가격을 더하지 않는 이유는 가격이 비싸면 그보다 더 싼 것들은 공짜이기 때문
if i != 0 and price == memo[i-1][1]: # 이전과 가격이 같으면 이전 것은 공짜가 아니기 때문에... cnt를 +1 하여 사야할 개수를 증가시킨다.
cnt += 1
else:
cnt = 1
dp[i] = dp[i-1] + memo[i][0] # 앞의 고기는 공짜이기 때문에 질량을 더한다.
if dp[i] >=m: # 못넘으면 의미 없음
min_price = min(price*cnt, min_price)
print(min_price)
728x90
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[python] 백준 11060 점프 점프 (0) | 2023.04.13 |
---|---|
[python] 백준 16562 친구비 (0) | 2023.04.13 |
[python] 백준 9526 1의 개수 세기 (0) | 2023.04.13 |
[python] 백준 9082 지뢰찾기 (0) | 2023.04.13 |
[python] 백준 4569 비밀번호 발음하기 (0) | 2023.04.12 |
댓글