stack을 이용하여 브라우저의 뒤로 가기와 앞으로 가기를 구현하시오.
매개 변수
새로운 페이지로 접속할 경우 prev 스택에 원래 있던 페이지를 넣고 next 스택을 비웁니다.
뒤로 가기 버튼을 누를 경우 원래 있던 페이지를 next 스택에 넣고 prev 스택의 top에 있는 페이지로 이동한 뒤 prev 스택의 값을 pop 합니다.
앞으로 가기 버튼을 누를 경우 원래 있던 페이지를 prev 스택에 넣고 next 스택의 top에 있는 페이지로 이동한 뒤 next 스택의 값을 pop 합니다.
브라우저에서 뒤로 가기, 앞으로 가기 버튼이 비활성화일 경우(클릭이 되지 않을 경우)에는 스택에 push 하지 않습니다.
const actions = ["B", "C", -1, "D", "A", -1, 1, -1, -1];
const start = "A";
console.log(browserStack(actions, start))
// [["A"], "B", ["A", "D"]]
const actions2 = ["B", -1, "B", "A", "C", -1, -1, "D", -1, 1, "E", -1, -1, 1];
const start2 = "A";
console.log(browserStack(actions, start))
// [["A", "B"], "D", ["E"]]
start가 문자열이 아닌 경우 false
이전 배열, 현재, 다음 배열을 구현한다.
반복문
위의 조건 사항에 맞게 하나씩 케이스를 적용 시켜준다.
function browserStack(actions, start) {
// start가 문자열이 아닌 경우
if(typeof(start) !== 'string') return false
let prevStack = []; // 이전페이지 스택
let nextStack = []; // 다음페이지 스택
let answer = [] // 출력 배열
for(let i = 0 ; i < actions.length; i++){
// 만일 배열의 요소가 문자열일 경우 새로운 페이지가 들어온 조건을 진행
if (typeof(actions[i]) !== 'number'){
prevStack.push(start) // 이전 스택에 start 넣기
start = actions[i] // start을 새로운 페이지로 초기화
nextStack = [] // 다음페이지 스택 초기화
}
// -1 = 뒤로가기, prevStack이 비어있는 경우 뒤로가기가 더이상 불가 하므로 prevStack이 0일 경우 진행하지 않는다.
else if (actions[i] === -1 && prevStack.length !== 0){
nextStack.push(start) // 다음 스택에 현재 페이지를 넣어주고
start = prevStack.pop() // 현재 페이지를 이전 스택에 맨 위의 값으로 넣어주고 이전 스택에서 빼준다.
}
// 1 = 앞으로 가기 nextStack이 비어있는 경우 앞으로가기가 더이상 불가 하므로 nextStack이 0일 경우 진행하지 않는다.
else if (actions[i] === 1 && nextStack.length !== 0){
prevStack.push(start) // 이전 스택에 현재 페이지를 넣어주고
start = nextStack.pop() // 현재 페이지를 다음 스택에 맨 위의 값으로 넣어주고 다음 스택에서 빼준다.
}
}
answer.push(prevStack)
answer.push(start)
answer.push(nextStack)
return answer
}