알고리즘 Queue, 프린터

e-pong:)·2022년 11월 18일
0

프린터

  • 인쇄 작업 목록은 칸으로 이루어져 있습니다.
  • 각 칸에는 한 개의 문서만 위치할 수 있습니다.
  • 문서는 1초에 한 칸만 이동할 수 있습니다.
  • 인쇄 작업 목록의 크기는 bufferSize이고 최대 용량 capacities 만큼 문서를 담을 수 있습니다.

인자 1: bufferSize
-> Number 타입의 인쇄 작업 목록 크기
인자 2: capacities
-> Number 타입의 인쇄 작업 목록에 추가될 수 있는 최대 용량
인자 3: documents
-> Number 타입을 요소로 갖는 문서 크기가 나열된 배열
출력
-> Number 타입을 리턴해야 합니다.

입출력 예시

let bufferSize = 2;
let capacities = 10;
let documents = [7, 4, 5, 6];

let output = queuePrinter(bufferSize, capacities, documents);
console.log(output) // 8

문제풀이

function queuePrinter(bufferSize, capacities, documents) {

    숫자 0 으로 채워진 printerQueue(이하 Queue)를 만들기

    documents의 가장 앞에 있는 요소를 제거해서, Queue의 가장 뒤쪽 요소와 바꿔준다.

    1초의 시간이 흘러야 한다.
    
    반복문(Queue의 데이터의 합이 0이 될 때 까지){
        Queue 의 맨 앞의 값을 제거해주고, 
        Queue 안에 들어있는 데이터의 합을 계산해서, 

        if(다음 데이터를 넣을 수 있다면){
            데이터를 넣어준다.
            시간을 센다.
        }
        else {
            0 을 넣어준다.
            시간을 센다.
        }
    }

    return 시간

}

Code

unction queuePrinter(bufferSize, capacities, documents) {
  let count = 0; 
  let queue = new Array(bufferSize).fill(0); 

  let currentDocu = documents.shift();
  queue.shift();
  queue.push(currentDocu);
  let queueSum = currentDocu;
  count = 1 ;
  
  while(queueSum > 0){
    currentDocu = documents.shift();
    queueSum = queueSum-queue.shift(); 
    
    if(currentDocu + queueSum <= capacities){
      queue.push(currentDocu) 
      queueSum = queueSum+currentDocu;
      count++  
    } 
    
    else {
      queue.push(0);
      documents.unshift(currentDocu);
      count++
    }
  }
  return count;
}

Reference

function queuePrinter(bufferSize, capacities, documents) {
    let count = 0;
    let queue = [];
    let totalBufferVolume = 0;

    for(let i = 0; i < bufferSize; i++){
        queue.push(0);
    }
    
    let currentDocument = documents.shift();
    
    queue.unshift(currentDocument);
    queue.pop();
    
    totalBufferVolume = totalBufferVolume + currentDocument;

    count++;
    
    while(totalBufferVolume){
        totalBufferVolume = totalBufferVolume - queue.pop();
        
        currentDocument = documents.shift();
        
        if(currentDocument + totalBufferVolume <= capacities){
 			queue.unshift(currentDocument);
            totalBufferVolume = totalBufferVolume + currentDocument;
        }else{
            documents.unshift(currentDocument);
            queue.unshift(0);
        }
        count++;
    }
    return count;
}
profile
말에 힘이 있는 사람이 되기 위해 하루하루, 성장합니다.

0개의 댓글