Queue
1. 개념
- 줄을 서서 기다리는 구조
- Stack과 반대되는 개념으로 먼저 들어간 데이터가 먼저 나옴
*FIFO(First In First Out) 혹은 LILO(Last In Last Out)
- 컴퓨터 장치들 사이에서 데이터(data)를 주고 받을 때, 각 장치 사이에 존재하는 속도의 차이나 시간 차이를 극복하기 위해 임시 기억 장치의 자료구조로 Queue를 사용
*이 과정을 버퍼(buffer)라고 함
- while 반복문과 짝궁
2. 구조
const queue = []
queue.push(1)
queue.push(2)
queue.push(3)
queue.push(4)
queue.push(5)
queue.shift()
queue.shift()
queue.shift()
queue.shift()
3. paveBox 예제
1) 처음 풀이
function paveBox(boxes) {
let result = []
let splitArr = (boxes) => {
let [head, ...tail] = boxes
let newArr = []
for(let i = 0; i < tail.length; i++) {
if(head < tail[i]) {
result.push(newArr.length + 1)
return splitArr(tail.slice(i))
} else if(head >= tail[i]) {
newArr.push(tail[i])
if(newArr.length === tail.length) {
return result.push(newArr.length + 1)
}
}
}
}
splitArr(boxes)
return Math.max(...result)
}
2) 다른 풀이
function paveBox(boxes) {
let answer = []
while(boxes.length > 0){
let findIdx = boxes.findIndex(el => boxes[0] < el);
if(finishIndex === -1){
answer.push(boxes.length)
break
} else {
answer.push(findIdx);
boxes.splice(0, findIdx);
}
}
4. queuePrinter 예제
- 프린터에 비해 속도가 빠른 CPU
: 빠른 속도로 인쇄에 필요한 데이터(data)를 만들어 인쇄 작업 (임시 기억 장치의) Queue에 저장하고 다른 작업을 수행
- 프린터
: 인쇄 작업 Queue에서 데이터(data)를 받아 Queue에 들어온 문서를 순서대로 인쇄
function queuePrinter(bufferSize, capacities, documents) {
let workSpace = []
let currentDocument = documents.shift()
workSpace.push(currentDocument)
let timer = 1
let workSpaceVolume = currentDocument
for(let i = 0; i < bufferSize - 1; i++) {
workSpace.push(0)
}
while(workSpaceVolume > 0) {
workSpaceVolume = workSpaceVolume - workSpace.pop()
currentDocument = documents.shift()
if(workSpaceVolume + currentDocument <= capacities) {
workSpace.unshift(currentDocument)
workSpaceVolume = workSpaceVolume + currentDocument
} else {
workSpace.unshift(0)
documents.unshift(currentDocument)
}
timer++
}
return timer
}