카테고리 없음

[릿코드/javascript] 740. Delete and Earn

_서리__ 2023. 3. 31. 11:00

문제

You are given an integer array nums. You want to maximize the number of points you get by performing the following operation any number of times:

  • Pick any nums[i] and delete it to earn nums[i] points. Afterwards, you must delete every element equal to nums[i] - 1 and every element equal to nums[i] + 1.

Return the maximum number of points you can earn by applying the above operation some number of times.

 

var deleteAndEarn = function(nums) {
    //굳이 지울 필요는 없을 것 같고,,...?? 하나 선택하면 앞뒤 숫자는 전혀 못쓴다고 봐야할듯.
    //같은 숫자는 몇번이든 선택할 수 있음.
    //즉 객체로 만들고, 앞뒤 숫자 제외하고 쓸 수 있는 수들 선택하면 될것같음.
    let obj = {}
    for(let i=0;i<nums.length;i++){
        if(!obj[nums[i]]) obj[nums[i]] = 0
        obj[nums[i]]++;
    }
    let max = Math.max(...nums)
    let arr = new Array(max+1).fill(0)
    for(let key in obj){
        arr[key] = obj[key]*key
    }
    for(let i=3;i<arr.length;i++){
        arr[i]+=Math.max(arr[i-2],arr[i-3])
    }
    return Math.max(...arr)
};

해당 문제는 내가 3을 번다고 생각하면 nums안에 있는 3은 백번이 있어도 모두 쓸 수 있지만, 2와 4는 백개가 있다고해도 하나도 쓸 수 없다. 문제에서는 딜리트하라고 하지만 굳이 딜리트할 필요없이 새로운 arr을 만들어서 풀었다. 해당 arr은 arr[3]에는 3을 모두 더한 값을 넣었다. 다시 이걸 돌면서 근접한 것들은 쓸 수 없음에 유의하여 max값을 찾아냈다.

 

var deleteAndEarn = function(nums) {
    let max = Math.max(...nums)
    let arr = new Array(max+1).fill(0)
    for(let i=0;i<nums.length;i++){
        arr[nums[i]]+=nums[i];
    }
    for(let i=3;i<arr.length;i++){
        arr[i]+=Math.max(arr[i-2],arr[i-3])
    }
    return Math.max(...arr)
};

리팩토링한것. 오브젝트 굳이 필요없이 바로 배열로 만들어도 가능하다.

훨씬 빨라지고 공간도 적게 차지한다.