programmers 순위 검색 ( 카카오 2021 기출) javascript

밍디·2021년 10월 28일
0

처음 풀엇는데,, 정확성은 맞았지만 효율성은 다 터졌다 ㅠㅡㅠ!


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

    const person=info.map(function(information){
        var temp=information.split(" ");
        return{
            language:temp[0],
            work:temp[1],//직무
            career : temp[2],
            food:temp[3],
            test:temp[4],
        }
    })
    
    //console.log(person);
    
    for(var i=0;i<query.length;i++){
        var temp = query[i].split(" "); 
        //0 2 4 6 7
        var condition=[temp[0],temp[2],temp[4],temp[6],temp[7]];

        solution(condition);
        
    }
    
    function solution(condition){


        const result=person.filter(p=>{
            
            if(p.language==condition[0]||condition[0]=='-'){
                if(p.work==condition[1]||condition[1]=='-'){
                    if(p.career==condition[2]||condition[2]=='-'){
                        if(p.food==condition[3]||condition[3]=='-'){
                            if(parseInt(p.test)>=parseInt(condition[4])){
                                return true;
                            }
                        }
                    }
                }
            }
            
            return false;
        });
        

        
        answer.push(result.length);

    }
    
    return answer;
}

그래서 방법을 바꿔야했고,,

조사한 결과 이분 탐색을 써야함을 알게되었다.

https://mofari.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%88%9C%EC%9C%84-%EA%B2%80%EC%83%89-javascript

이 코드를 참고하여 원리를 이해하고 코드를 작성하였다.

function solution(info, query) {

    var map ={};
    var result=[];
    for(var i=0;i<info.length;i++){
        var temp=info[i].split(" ");
        var score=temp.pop();

        comb(temp,score,0);
    }
    function comb(arr,score,index){
        
        var key=arr.join("");
        var exist=map[key];

        if(exist){
            map[key].push(score);
        }else{
            map[key]=[score];
        }

        for(var i=index;i<4;i++){
            let tmp=[...arr];
            tmp[i]='-';
            comb(tmp,score,i+1);
        }
    }

    for(var key in map){
        map[key].sort((a,b)=>a-b);        
    }
    

    
    for(var i=0;i<query.length;i++){
        var qr= query[i].replace(/ and /g,"").split(" ");
        var query_score=qr.pop();

        if(map[qr[0]]){
          result.push(binary(map[qr[0]],query_score));  
        }
        else result.push(0);
    }
    

    function binary(candidate,score){
        var start = 0;
        var end = candidate.length;
            
        while(start < end){
            var mid = Math.floor((start+end)/2);
            if(Number(candidate[mid]) >= score){ // 현재 가르키는 값보다 내가 찾는 값이
                end = mid;
            }else if(Number(candidate[mid]) < score){
                start = mid + 1;
            }
        }

        return candidate.length-start;
    }
    return result;
}
profile
노후를 위해 꾸준히 공부하자.

0개의 댓글