> 기초/코테 연습

TIL-2024.04.15 - 코테연습 - 추천 제품(2).programmers

Janku 2024. 4. 15. 18:24

 

 

 

코드:

 

// URL >

const solution = (products, purchased) => {
    /*
    * How To Solve (HTS)
    * 1. 전체 products에서, 구매한 적이있는 purchased 를 빼서, unpurchased 찾기
    * 2. purchased에서 추천 목록 찾기
    * 3. unpurchased에서 purchased 맞는거 찾기
    * */

    const productsMap = new Map();
    let bought = [];
    let unpurchased = [];
    let unpurchasedProperty = [];


    for (let i = 0; i < products.length; i++) {
        const product = products[i].split(" ");
        let property = "";
        for (let j = 1; j < product.length; j++) {
            if (j !== 1) property += " ";
            property += product[j];
        }
        productsMap.set(product[0], property);
        bought.push(product[0]);
    }

    console.log(1, productsMap);
    console.log(2, bought);

    unpurchased = bought.filter(item => !purchased.includes(item));
    console.log(3, unpurchased);

    let tempArr = [];
    let purchasedPropertyMap = new Map();

    for (let i = 0; i < purchased.length; i++) {
        const purchasedItemProperty = productsMap.get(purchased[i]);
        let purchasedItemPropertySplit = purchasedItemProperty.split(" ");
        for (let j = 0; j < purchasedItemPropertySplit.length; j++) {
            tempArr.push(purchasedItemPropertySplit[j]);
            if (purchasedPropertyMap.has(purchasedItemPropertySplit[j])) {
                let value = purchasedPropertyMap.get(purchasedItemPropertySplit[j]);
                purchasedPropertyMap.set(purchasedItemPropertySplit[j], value + 1);
            } else {
                purchasedPropertyMap.set(purchasedItemPropertySplit[j], 1);
            }
        }
    }
    let tempEntries = Array.from(purchasedPropertyMap);
    // Sort the array by values first, then by keys if values are the same
    tempEntries.sort((a, b) => {
        // Compare values (a[1] and b[1])
        if (a[1] !== b[1]) {
            return b[1] - a[1]; // Sort by value
        } else {
            // If values are the same, compare keys (a[0] and b[0])
            if (a[0] > b[0]) {
                return 1;
            } else if (a[0] < b[0]) {
                return -1;
            }
        }
    });
    purchasedPropertyMap = new Map(tempEntries);

    let result = ''
    let tempUnpurchased = [...unpurchased]

    purchasedPropertyMap.forEach((value, key) => {
        for (let i = 0; i < unpurchased.length; i++) {
            let split = productsMap.get(unpurchased[i]).split(" ")
            if(!split.includes(key)){
                const index = tempUnpurchased.indexOf(unpurchased[i])
                tempUnpurchased.splice(index, 1)
            }
            if(tempUnpurchased.length === 1){
                result = tempUnpurchased[0]
            }
        }
    });

    return result;
};

console.log("result:: ", solution([ "sofa red long", "blanket blue long", "towel red", "mattress long", "curtain blue long cheap" ], [ "towel", "mattress", "curtain" ])); // "blanker"
console.log("result:: ", solution(["towel red long thin", "blanket red thick short", "curtain red long wide", "mattress thick", "hat red thin", "pillow red long", "muffler blue thick long"], ["blanket", "curtain", "hat", "muffler"])); // "towel