Stack 실습 - 브라우저 뒤로가기, 앞으로 가기 구현
인터넷 브라우저에서 행동한 순서가 들어있는 배열 actions와 시작 페이지 start가 주어질 때 마지막에 접속해 있는 페이지와 방문했던 페이지들이 담긴 스택을 반환하는 솔루션을 만들어보자
function browserStack(actions, start) {
// TODO: 여기에 코드를 작성합니다.
if ( typeof start !== 'string') {
return false;
}
// 뒤로기가 앞으로가기 변수
let prevStack = [];
let nextStack = [];
let now = start;
for (let i = 0; i < actions.length; i++ ) {
// -1 (뒤로가기), prevStack 에 이전페이지가 있을경우
if ( actions[i] === -1 && prevStack.length !== 0 ) {
// prevStack에서 pop를 한 요소를 이전페이지에 할당
// nextStack에는 현재페이지
// 현재 페이지를 이전페이지에 할당
let prevPage = prevStack.pop();
nextStack.push(now);
now = prevPage;
}
// 1(앞으로 가기), 다음 페이지가 있을경우
else if ( actions[i] === 1 && nextStack.length !== 0 ) {
// nextStack에서 pop를 한 요소를 다음페이지에 할당
// prevStack에 현재페이지
// 현재페이지를 다음페이지에 할당
let nextPage = nextStack.pop();
prevStack.push(now);
now = nextPage;
}
// 새로운페이지
else if( typeof actions[i] === 'string' ) {
// prevStack에 현재페이지를 삽입
// 현재페이지에 string요소 할당
// 새로운 페이지이기때문에 다음페이지는 비어있음
prevStack.push(now);
now = actions[i];
nextStack = [];
}
}
return [prevStack, now, nextStack];
}
Queue - 박스 포장
마트에서 장을 보고 박스를 포장하려고 한다. 박스를 포장하는 데는 폭이 너무 좁고, 그렇기에 한 줄로 서 있어야 하는데 다음과 같은 조건을 만족해야 한다.
ex) 만약, 앞사람의 박스는 5 개고, 뒷사람 1의 박스는 4 개, 뒷사람 2의 박스는 8 개라고 가정했을 때, 뒷사람 1이 제일 먼저 박스 포장을 끝내게 되어도 앞사람 1의 포장이 마칠 때까지 기다렸다가 같이 나가게 된다. 이때, 통틀어 최대 몇 명이 한꺼번에 나가는지 알 수 있도록 함수를 구현해보자.
function paveBox(boxes) {
// TODO: 여기에 코드를 작성합니다.
let success = [];
while ( boxes.length > 0 ) {
// ex)5,1,4,6이 있다면 boxes[0]인 5보다 큰 6. 6이 가리키는 index 3. 3을 finish에 넣어준다.
let finish = boxes.findIndex ( el => boxes[0] < el);
if(finish === -1){
// 만약 찾지 못했다면 success에 boxes 배열의 길이를 넣은 후, boxes 내부의 요소를 모두 삭제
success.push(boxes.length);
boxes.splice(0, boxes.length);// 한꺼번에 빠져나간만큼 지운다.
}
else {
// 만약 찾았다면, 해당 인덱스를 success에 넣고, boxes에서 그만큼 제외
success.push(finish);
boxes.splice(0, finish);
}
}
return Math.max(...success);
}