프로그래머스 | 순위 검색

커몽·2021년 1월 28일
2

프로그래머스 level2

목록 보기
11/38

2차풀이

javascript
카카오에서 올려준 풀이 읽어보고 obj까지는 작성해 보았지만 binary search는 써본적이 없어서 구글에 검색해서 다른 풀이를 보고 완성했다.
반복문과 조건문이 중첩되있어서 else부분 위치를 잘못 잡고 채점하면 자꾸 오답나왔는데 어디가 문젠지 몰라서 시간을 엄청 썼다,,
마지막 answer.push(0)부분을 한단계 안에서 했더라,,
매번 이런식으로 시간 잡아먹는데 어떻게 하면 해결할 수 있을까....ㅜ

진짜 어디가 문젠지 몰라서 하나하나 콘솔창에 다 찍어보고 그래도 어딘지 몰라서 프로그래머스에서 포인트? 점수? 내고 다른사람 풀이 볼 수 있어서 점수 내고 풀이도 봤는데 별 도움 안됐고 밥먹고 돌아와서 다시 보니까 해결!

function solution(info, query) {
    const answer = [];
    const obj={};
    for(let i=0;i<info.length;i++){
        let infoArr=info[i].split(' ');
        let infoScore=infoArr.pop();
        for(let j=0;j<=infoArr.length;j++){
           let combination=getCombination([0,1,2,3],j);
            for(let k=0;k<combination.length;k++){
                let newInfo=[...infoArr];
                for(let l=0;l<combination[k].length;l++){
                    newInfo[combination[k][l]]='-';
                }
                let changedNewInfo=newInfo.join('/')
                
                if(changedNewInfo in obj){
                    obj[changedNewInfo].push(Number(infoScore));
                }else{
                     obj[changedNewInfo]=[Number(infoScore)];
                }     
            }
        }
    }
   
    for (const [key, value] of Object.entries(obj)) { 
        value.sort((a,b)=>a-b);
    } 
    for(let i=0;i<query.length;i++){
        let queryArr=query[i].split(' ').filter(e=>e!=='and');
        
        let queryScore=Number(queryArr.pop());
        queryArr=queryArr.join('/');
        if(queryArr in obj){
            let data=obj[queryArr];
            if(data.length>0){
                let start=0;
                let end=data.length;
                while(start<end){
                    if(data[Math.floor((start+end)/2)]>=queryScore){
                        end=Math.floor((start+end)/2)
                    }else{
                        start=Math.floor((start+end)/2)+1;
                    }
                }
                answer.push(data.length - start)
            }
        }else{
                answer.push(0)
        }
    }
    return answer;
}

const getCombination=(arr,n)=>{
    
    if(n===0)return [[]]
    if(n===1)return arr.map(e=>[e]);
    const result=[];
    arr.forEach((fixed,idx,origin)=>{
        const rest=origin.slice(idx+1);
        const combinations=getCombination(rest,n-1);
        const attached=combinations.map(combi=>[fixed,...combi]);
        result.push(...attached);
    });
 return result  
}

1차로 풀었을 때 코드

테스트케이스만 통과하고 제출하면 1개만 맞았던 풀이..
당연히 효율성 테스트에서 0점..
그래도 혼자서 작성해본 코드라서 기록 해놓기~

function solution(info, query) {
    const answer = [];
    for(let j=0,queryL=query.length;j<queryL;j++){
        let count=0;
        let queryArr=query[j].split(' ').filter(e=>e!=='and');
        console.log('queryArr',queryArr)
        let consider=queryArr.reduce((acc,e,idx)=>{
            if(e!=='-'){
                acc.push([e,idx])
            }
            return acc
        },[]);
        console.log(consider)
        for(let i=0,infoL=info.length;i<infoL;i++){
            let infoArr=info[i].split(' ')
            console.log(infoArr);
            
            if(queryArr.length===consider.length){
                if(infoArr[0]===queryArr[0]&&infoArr[1]===queryArr[1]&&infoArr[2]===queryArr[2]&&infoArr[3]===queryArr[3]&&infoArr[4]>=queryArr[4]){
                    console.log('right');
                    count++;
                }
            }else{
                let total=0;
                for(let c=0,cL=consider.length;c<cL;c++){
                    if(consider[c][1]===4){
                        if(Number(infoArr[consider[c][1]])>=Number(consider[c][0])){
                            total++;
                            console.log('consider right score',consider[c][0])
                        }
                    }else{
                        
                        if(infoArr[consider[c][1]]===consider[c][0]){
                            total++;
                            console.log('consider rignt',consider[c][0])
                        }
                    }
                    console.log(total)
                    if(total===consider.length){
                    count++;
                }
                }
                
            }   
           
        
        } answer.push(count)
    }
    console.log(answer)
    return answer;
}

for문과 forEach

항상 두개중에 어떤게 더 빠른지 궁금했는데 이 문제에서 효율성 테스트카 포함 되어 있어서 이번에 찾아 보게 되었다. 결론은 for문이 더 빠르다!
for문을 쓰면서도

for(let i=0;i<arr.length;i++){
//...
}

이것 보다

for(let i=0,arrL=arr.length;i<arrL;i++){
//...
}

이런식으로 쓰는게 더 빠르다고 한다.
두번째 방식 같이 길이를 변수에 저장해서 쓰는 것을 배열길이 캐싱이라고 하는 듯 하다

0개의 댓글