목차
최대 사과의 개수
여러 종류의 사과박스가 있습니다.
각 박스의 종류에 따라 박스에 담겨있는 사과의 개수가 다릅니다.
트럭에 박스를 실으려고 합니다. 트럭에 박스을 실을 수 있는 최대 개수 제한이 있습니다.
매개변수 box에 각 박스 종류의 정보가 주어지고, limit에 트럭의 실을 수 있는 박스의 최대 개수가 주어지면 트럭에 실을 수 있는 사과의 최대 개수를 반환하는 프로그램을 작성하세요.

제한사항:
• box의 길이는 100,000을 넘지 않습니다.
• box[i][0]은 i 종류 박스의 개수, box[i][1]은 i 종류의 박스 한 개에 들어 있는 사과의 개수 입니다. 서로 다른 종류의 박스라도 담아 있는 사과의 개수는 같을 수 있습니다.
• 1 <= box[i][0] <= 100, 1 <= box[i][1] <= 100
• 1 <= limit <= 10,000,000
나의 코드
def solution(box, limit):
answer = 0
box.sort(key= lambda x: -x[1])
for x in box:
if limit>=x[0]:
limit=limit-x[0]
answer=answer+x[1]*x[0]
elif limit <x[0]:
answer=answer+x[1]*limit
break
return answer
print(solution([[2, 20], [2, 10], [3, 15], [2, 30]], 5))
print(solution([[1, 50], [2, 20], [3, 30], [2, 31], [5, 25]], 10))
print(solution([[3, 40], [5, 20], [5, 70], [1, 80], [5, 30], [3, 35]], 15))
print(solution([[2, 70], [5, 100], [3, 90], [1, 95]], 8))
print(solution([[80, 20], [50, 10], [70, 15], [70, 30], [80, 70], [90, 88], [70, 75]], 500))
최대한 많은 갯수를 담기 위해 [사과종류,사과갯수]의 원소를 사과 갯수를 역정렬하여 많은 갯수 부터 담도록 하였고 Limit보다 사과종류가 더 적은 경우를 분기 처리 하였다.
정답 코드
def solution(box, limit):
answer = 0
box.sort(key = lambda v : -v[1])
for x in box:
cnt = min(limit, x[0])
answer += (cnt * x[1])
limit -= cnt
if limit == 0:
break
return answer
print(solution([[2, 20], [2, 10], [3, 15], [2, 30]], 5))
print(solution([[1, 50], [2, 20], [3, 30], [2, 31], [5, 25]], 10))
print(solution([[3, 40], [5, 20], [5, 70], [1, 80], [5, 30], [3, 35]], 15))
print(solution([[2, 70], [5, 100], [3, 90], [1, 95]], 8))
print(solution([[80, 20], [50, 10], [70, 15], [70, 30], [80, 70], [90, 88], [70, 75]], 500))
정답 코드도 같은 로직을 구성하였지만 cnt의 하나의 변수로 answer를 합해주어서 더 가독성이 좋은것 같다.
'코딩테스트[파이썬] > 입문자를 위한 코딩테스트 핵심' 카테고리의 다른 글
[그리디] -카드 점수 (0) | 2024.01.23 |
---|---|
[다시보기] [그리디] - 선긋기 (0) | 2024.01.23 |
[그리디] -버스 (0) | 2024.01.23 |
[정렬] - 두수의 합 (0) | 2024.01.22 |
[정렬] - 두 수의 차 (0) | 2024.01.22 |