알고리즘/Softeer

Softeer - 금고털이 / Python

Hwisaek 2021. 10. 16. 16:38
반응형

문제: https://softeer.ai/practice/info.do?eventIdx=1&psProblemId=395 

 

Softeer

제한시간 : C/C++(1초), Java/Python(2초) | 메모리 제한 : 256MB 루팡은 배낭을 하나 메고 은행금고에 들어왔다. 금고 안에는 값비싼 금, 은, 백금 등의 귀금속 덩어리가 잔뜩 들어있다. 배낭은 W ㎏까지

softeer.ai

문제 설명

더보기

루팡은 배낭을 하나 메고 은행 금고에 들어왔다. 금고 안에는 값비싼 금, 은, 백금 등의 귀금속 덩어리가 잔뜩 들어있다. 배낭은 W ㎏까지 담을 수 있다. 각 금속의 무게와 무게당 가격이 주어졌을 때 배낭을 채울 수 있는 가장 값비싼 가격은 얼마인가?

루팡은 전동톱을 가지고 있으며 귀금속은 톱으로 자르면 잘린 부분의 무게만큼 가치를 가진다.

입력 형식

첫 번째 줄에 배낭의 무게 W와 귀금속의 종류 N이 주어진다. i + 1 (1 ≤ i ≤ N) 번째 줄에는 i번째 금속의 무게 Mi와 무게당 가격 Pi가 주어진다.

입력은 다음 조건을 만족한다.
    1 ≤ N ≤ 106 인 정수
    1 ≤ W ≤ 104 인 정수
    1 ≤ Mi, Pi ≤ 104 인 정수

출력 형식

첫 번째 줄에 배낭에 담을 수 있는 가장 비싼 가격을 출력하라.

입력 예제

100 2
90 1
70 2

출력 예제

170


 


정답

# https://softeer.ai/practice/info.do?eventIdx=1&psProblemId=395
import sys

input = sys.stdin.readline

w, n = map(int, input().split())

jewels = [list(map(int, input().split())) for _ in range(n)]

jewels.sort(key=lambda x: x[1], reverse=True)

answer = 0
for weight, price in jewels:
    if w > weight:
        answer += weight * price
        w -= weight
    else:
        answer += w * price
        break

print(answer)

 


풀이

 보석을 가방에 최대한 담되 가장 비싼 보석들을 위주로 가져가는 그리디 알고리즘 문제입니다.

 

 무게당 가격이 비싼 보석 순으로 가져가면 되며, 무게가 부족하면 톱으로 귀금속을 잘라서 가져갈 수 있으므로 넣을 수 있는 무게만큼 최대한 가져가면 됩니다. 보석을 가격순으로 정렬 후 반복하면서 (무게 * 무게 당 가격)만큼 answer를 증가시키고 무게가 모자라면 (남은 공간 * 해당 보석의 무게 당 가격)을 증가시키고 반복을 멈추면 해결할 수 있습니다.

반응형

'알고리즘 > Softeer' 카테고리의 다른 글

Softeer - 성적 평균 / Python  (0) 2021.10.16
Softeer - 바이러스 / Python  (0) 2021.10.16
Softeer - 8단 변속기 / Python  (0) 2021.10.16
Softeer - 장애물 인식 프로그램 / Python  (0) 2021.10.16