๐Ÿ’ฏ CodingTest/Programmers

[Programmers] (Javascript) ์ˆœ์œ„ ๊ฒ€์ƒ‰

S.Honey 2022. 5. 2. 17:03

https://programmers.co.kr/learn/courses/30/lessons/72412

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ์ˆœ์œ„ ๊ฒ€์ƒ‰

["java backend junior pizza 150","python frontend senior chicken 210","python frontend senior chicken 150","cpp backend senior pizza 260","java backend junior chicken 80","python backend senior chicken 50"] ["java and backend and junior and pizza 100","pyt

programmers.co.kr

- ์ตœ๊ทผ ํ’€์—ˆ๋˜ ๋ฌธ์ œ ์ค‘ ๊ฐ€์žฅ ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

 

โ–ถ ์ฝ”๋“œ : 

let data = new Map();

function makeData(info)
{
    let scores = [];
    for(let s of info)
    {
        s = s.split(' ');
        let arr = s.slice(0,4);
        let score = parseInt(s[4]);
        scores.push(score);
        s= arr.join('');
        if (data.has(s))
        {
            val = data.get(s);
            val = [...val, score]
            data.set(s, val);
        }
        else
        {
            data.set(s,[score]);
        }    
    }

    let keyList = data.keys();

    for (const key of keyList)
    {
        let temp = data.get(key).sort((a,b) => a-b);
        data.set(key, temp);            
    }
}

function solution(info, query) {
    let answer = [];
    makeData(info);

    let keyList = [...data.keys()];
    
    query.map((s) => {
        s = s.split(' ');
        let qScore = s.pop();
        s= s.filter((element) => {if (element !== '-' && element !== 'and'){return true;}});        
        let temp = keyList.filter((key) => s.every(word => key.includes(word)));
        
        let count = 0;
        for (const key of temp)
        {
            let d = data.get(key);
            count += d.length - binarySearch(d, qScore);
        }

        answer.push(count)
    });

    return answer;
}

function binarySearch(arr, score){
    let low = 0;
    let high = arr.length - 1;
    let mid;

    while(low < high)
    {
        mid = Math.floor((low+high) / 2);
        // lower bound ์‚ฌ์šฉ high๋ฅผ mid -1์ด ์•„๋‹Œ mid๋กœ ์„ค์ •
        if(arr[mid] >= score)
        {
            high = mid;
        }
        else
        {
            low = mid + 1;
        }
    }

    //๋งŒ์ผ arr์— score๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ
    if(arr[high] < score){
        high += 1;
    }
    return high;
}

 

โ–ถ ๋ฌธ์ œ ํ’€์ด :

1. ์ดˆ๊ธฐ info์— ๋Œ€ํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ํŒŒ์‹ฑํ•˜๊ณ  Map()์— key๋กœ ๋ฌธ์ž์—ด, value๋กœ ์ ์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค.

  - ์ด๋•Œ value๋Š” ์ ์ˆ˜๋“ค์˜ ๋ฐฐ์—ด๋กœ ์ €์žฅํ•˜๋ฉฐ, Map() ์ดˆ๊ธฐํ™”๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ ๊ฐ key๋ฅผ ์ด์šฉํ•ด ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์ค€๋‹ค.(์ด๋ถ„ ํƒ์ƒ‰์„ ์œ„ํ•ด)

2. query ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ํ•ด๋‹น query์— ํฌํ•จ๋œ ๋ฌธ์ž์—ด๋“ค์ด Map()์˜ key ๋ฌธ์ž์—ด์— ํฌํ•จ๋˜์—ˆ๋Š”์ง€ ๊ฒ€์‚ฌ ํ›„ ํฌํ•จํ•˜๋Š” ํ‚ค๋“ค๋งŒ์„ ์ถ”์ถœํ•œ๋‹ค. 

3. ์ดํ›„ ์ถ”์ถœํ•œ key๋“ค์— ๋Œ€ํ•ด Map()์—์„œ ์ ์ˆ˜๋ฐฐ์—ด์„ ๊ฐ€์ ธ์™€ ์ด๋ถ„ ํƒ์ƒ‰์„ ์ด์šฉํ•ด ์›ํ•˜๋Š” index๋ฅผ ์ฐพ๊ณ  ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค.

4. ๊ฐ query๋ฌธ์— ๋Œ€ํ•˜์—ฌ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์ฟผ๋ฆฌ๋ฌธ ๋งˆ๋‹ค countํ•œ ๊ฐ’์„ answer๋ฐฐ์—ด์— push ํ•œ๋‹ค.