본문 바로가기

알고리즘 문제풀이

[프로그래머스] 고득점 키트 - 스택/큐3

오늘 푼 문제

 

3. 프린터/ Lv.2/ 시간 : 42분(타임오버)

programmers.co.kr/learn/courses/30/lessons/42587?language=javascript

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

 

1차

function solution(priorities, location) {
    var answer = 0;
    let keep = true;
    
    priorities = priorities.map((v,i)=>{return {val:v, index: i}});
    
    while(keep){
        let tempMax = 0;
        let tempPos = 0;
        let tempStack = [];
        let newStack = [];
        answer++;
        while(priorities.length){
            const cur = priorities.shift();
            if(cur.val<=tempMax){
                tempStack.push(cur);
            }else{
                newStack.push(...tempStack);
                tempMax = cur.val;
                tempPos = cur.index;
                tempStack = [{val:tempMax, index:tempPos}];
            }
        }
        if(tempPos===location){
            keep = false;
        }else{
            tempStack.shift();
            priorities = [...tempStack,...newStack];
        }
    }
    
    return answer;
}

 

2차 : every 사용

function solution(priorities, location) {
    var answer = 0;
    let processed = 0;
    
    const priorityObjects = priorities.map((val,i)=>{
        return {value : val, originLocation : i}
    });
        
    while(true){
        const target = priorityObjects.shift();
        
        if(priorityObjects.every(ob=> ob.value<=target.value) ){
            processed++;
            if(target.originLocation === location){
                answer = processed;
                break;
            }
        }else{
            priorityObjects.push(target);
        }
    }
    
    return answer;
}

 

3차 : 추가 객체 할당 없이

function solution(priorities, location) {
    var answer = 0;
    let order  = 0;
    let index  = 0;

    while(priorities.length!==0){
        const target = priorities.shift();
        const max = Math.max(...priorities);

        if(target>=max){
            order++;
            if(index === location){
                answer = order;
                break;;
            }
        }else{
            priorities.push(target);
            if(location===index){
                location = priorities.length-1;
                index = 0;
                continue;
            }
        }

        index++;
    }

    return answer;
}

 

시간 비교

1차/ 2차/ 3차