CS기초/코딩테스트

LeetCode 1710 (Easy) Maximum Units on a Truck

오늘의 나1 2021. 3. 3. 21:30
출처: leetcode.com/problems/maximum-units-on-a-truck/
 

Maximum Units on a Truck - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

문제

한글 번역은 아래 더보기를 클릭해주세요. 

더보기

한 대의 트럭에 정해진 갯수의 박스만 실을 수 있다. boxTypes[i] = [numberOfBoxes(i), numberOfUnitsPerBox(i)]인 이차원 배열 boxTypes이 주어질 때:

  • numberOfBoxes(i)는 타입 i의 박스의 갯수이다
  • numberOfUnitsPerBox(i)는 타입 i의 박스 한 개에 있는 유닛의 갯수이다

정수 truckSize가 주어지는 데, 이는 트럭에 실을 수 있는 박스의 최대 갯수를 의미한다. 박스의 최대 갯수를 초과하기 전까지 박스를 실을 수 있다.

트럭에 실을 수 있는 유닛의 최대 갯수를 구하여라.

 

예제 1:

  • 입력: boxTypes=[[1, 3], [2, 2], [3, 1]], truckSize=4
  • 출력: 8
  • 설명:
    - 타입 0: 박스 1개, 박스 당 유닛 3개
    - 타입 1: 박스 2개, 박스 당 유닛 2개
    - 타입 2: 박스 3개, 박스 당 유닛 1개

    타입 0 박스 1개, 타입 1 박스 2개, 타입 2 박스 1개를 실을 수 있다.
    트럭에 실은 유닛의 갯수는 (1 * 3) + (2 * 2) + (1 * 1) = 8

예제 2:

  • 입력: boxTypes=[[5, 10], [2, 5], [4, 7], [3, 9]], truckSize=10
  • 출력: 91

풀이

해결방법

상자 한 개에 유닛이 많은 순으로 정렬하여
truckSize를 채우기 전까지 순서대로 상자를 넣는다.

 

javascript

/**
 * @param {number[][]} boxTypes
 * @param {number} truckSize
 * @return {number}
 */
var maximumUnits = function(boxTypes, truckSize) {
    // 상자 한 개에 유닛이 많은 순으로 정렬하여
    boxTypes.sort((a, b) => {
        return b[1] - a[1];
    });
    
    let boxTypeLen = boxTypes.length
    let maxUnits = 0;
    let i = 0;
    // 트럭이 찰 때까지 순서대로 넣는다
    while (truckSize > 0 && i < boxTypeLen) {
        const boxCount = Math.min(boxTypes[i][0], truckSize)
        maxUnits += boxCount * boxTypes[i][1]
        truckSize -= boxCount
        i += 1
    }
    
    return maxUnits
};

python

class Solution:
    def takeUnitCount(self, boxType):
        return boxType[1]
    
    def maximumUnits(self, boxTypes: List[List[int]], truckSize: int) -> int:
        boxTypes.sort(key=self.takeUnitCount, reverse=True)
        
        maxUnits = 0
        for boxType in boxTypes:
            if truckSize is 0:
                break
            boxCount = min(boxType[0], truckSize)
            maxUnits += (boxCount * boxType[1])
            truckSize -= boxCount
            
        return maxUnits

결과

파이선 문법 알게된 것

List.sort로 커스텀 정렬하기

def takeSecond(arr):
    return arr[1]
 
 boxTypes = [[1, 3], [2, 2], [3, 1]]
 boxTypes.sort(key=takeSecond, reverse=True) # 아이템[1]로 정렬하고, 내림차순으로 정렬