할머니의 콤퓨타 도전기

Javascript로 프로그래머스 스택/큐 문제 풀기 본문

Algorithm/Problem Solving

Javascript로 프로그래머스 스택/큐 문제 풀기

ji.o.n.e 2021. 6. 25. 01:35

오늘은 자바스크립트로 프로그래머스 고득점 kit 스택/큐 문제를 풀어보았습니다.

 

 

1. 기능개발 (Level 2)

https://programmers.co.kr/learn/courses/30/lessons/42586?language=javascript 

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr

  • 풀이 설명
    • 우선 각 기능 별 작업 기간을 구한다.
    • 뒷 기능의 작업 기간이 앞선 작업 기간 보다 작을 경우 함께 배포된다.
      • 이를 위해 x(앞선 기능 중 가장 긴 작업 기간)를 기준으로 x보다 현재 기능의 작업 기간이 작거나 같게 걸리는 동안 while문을 돈다.
        • x보다 작거나 같게 걸린다면 cnt를 1씩 증가시켜 함께 배포될 기능의 수를 센다.
      • 작업 기간이 x보다 오래걸리는 기능이 등장하게 되면 while문을 벗어나고 cnt를 answer에 push한다. 또한 x 값이 갱신된다.

 

  • 코드 구현
    • 자바스크립트 나누기에서 몫은 parseInt로 정수로 변환해 구할 수 있다.
function solution(progresses, speeds) {
    let answer = [];
    let period = [];
    for(let i=0; i < progresses.length; i++){
        period[i] = parseInt((100-progresses[i])/speeds[i]) + !!((100-progresses[i])%speeds[i]);
    }
   
    for(let i=0; i < period.length; i++){
        let x = period[i];
        let cnt = 0;
        while(x >= period[i]){
            cnt += 1;
            i += 1;
        }
        i -= 1;
        answer.push(cnt);
    }
    return answer;
}

 

  • 다른 사람 코드
    • 이 코드가 훨씬 깔끔하고 좋은 것 같다.
    • Math.ceil을 사용하면 나머지에 관한 처리를 따로 해주지 않아도되는구나.
function solution(progresses, speeds) {
    let answer = [0];
    let days = progresses.map((progress, idx) => Math.ceil((100-progress)/speeds[idx]));
    let maxDay = days[0];
    
    for(let i=0, j=0; i<days.length; i++){
        if(days[i] <= maxDay){
            answer[j] += 1;
        }     
        else{
            answer[++j] = 1;
            maxDay = days[i];
        }
    }
    return answer;
}

 

 

2. 프린터 (Level 2)

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

 

코딩테스트 연습 - 프린터

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

programmers.co.kr

function solution(priorities, location) {
    let answer = 1;
    let top = -1;
    
    while (priorities.length > 0){
        top = priorities.shift(); // 가장 앞에 있는 문서 꺼냄
        
        // 중요도 높은 문서 존재 check 
        if (priorities.some(priority => priority > top)){
            priorities.push(top); // 대기 목록 마지막에 push
        } 
        else {
            if (location === 0) break; // 요청 문서 인쇄
            else answer ++;
        }
        
        if (location === 0) // 요청 문서의 중요도가 가장 높지 않는 경우
            location = priorities.length -1; 
        else location --;
            
    }
    return answer;
}

 

 

3. 다리를 지나는 트럭 (Level 2)

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

 

코딩테스트 연습 - 다리를 지나는 트럭

트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈

programmers.co.kr

  • 풀이 설명
    • 우선 0으로 bridge_length 만큼 bridge를 채운다.
    • 1초마다 1칸씩 이동이 가능하니, 매번 bridge의 앞에서 하나씩 빼고 트럭을 올릴 수 있다면 트럭을 bridge에 올리고, 그렇지 않다면 0으로 채운다.
  • 코드 구현
function solution(bridge_length, weight, truck_weights) {
    let answer = 0;
    let bridge = new Array(bridge_length).fill(0);
    
    while(bridge.length){
        answer ++;
        bridge.shift();
        if(truck_weights.length){ // 올릴 트럭이 남아있다면
            let truck = truck_weights[0];
            const total_weight = bridge.reduce((acc, val) => acc + val, 0);
            
            if(truck + total_weight <= weight){
                bridge.push(truck_weights.shift());
            }else{
                bridge.push(0);
            }
        }
    }
    
    return answer;
}
Comments