let prevStack = [];
let nextStack = [];
let current = start;
for(let i = 0; i < actions.length; i++) {
// 만약 , action 배열의 element가 -1 (뒤로가기) 그리고
// prevStack length가 0 이 아닐 때 (이전으로 돌아갈 페이지가 있다면)
if(action[i] === -1 && prevStack.length !== 0){
// prevStack에서 pop으로 제거한 요소를 prevPage로 할당해준다.
// nextStack에 current를 삽입해준다.
// prevPage를 current에 할당해준다.
let prevPage = prevStack.pop();
nextStack.push(current);
currnet = prevPage;
// 만약 actions 배열의 요소가 1이고 (앞으로 가기) ,
// 그리고 nextStack의 길이가 0 이 아닐 때 (다음으로 넘어갈 갈 페이지가 있다면)
} else if(actions[i] === 1 && nextStack.length !== 0){
// nextStack에서 pop으로 제거한 요소를 nextPage로 할당해준다.
// prevStack에 current 를 삽입한다.
// nextPage를 current에 할당해준다.
let nextPage = nextStack.pop();
prevStack.push(current);
current = nextPage;
// 만약 actions 배열의 요소가 알파벳이라면 (새로운 페이지)
}else {
// prevStack에 current를 삽입한다.
// current를 현재 알파벳 요소를 할당한다.
// 새로운 페이지는 앞으로 갈 수 없기 때문에, nextStack을 비운다.
prevStack.push(current);
current = actions[i];
nextStack = [];
}
}
// 배열에 prevStack, current, nextStack을 순서대로 담아 반환한다.
return [prevStack, current, nextStack];
}
function browserStack(actions, start) {
let prevStack = []; // 이전 페이지 (뒤로가기)
let nextStack = []; // 다음 페이지 (앞으로 가기)
let current = start; // start가 현재 페이지를 나타내기 때문에 변수에 할당해줌
for(let i = 0; i < actions.length; i++){ // actions 배열을 순회
if(actions[i] === -1 && prevStack.length !== 0){ // i번째 인덱스 값중에 뒤로가기 버튼도 있고, 이전스택의 값이 존재한다면
let prevPage = prevStack.pop(); // 이전스택의 마지막 요소를 제거한 요소를 이전페이지에 할당해준다.
nextStack.push(current); // 뒤로가기를 했으니까 앞의 Stack에 현재 페이지를 추가해준다.
current = prevPage; // 현재 페이지에 뒤로가기 한 페이지를 할당해준다.
}else if(actions[i] === 1 && nextStack.length !== 0){ // i번째 인덱스값 중에 앞으로 가기 버튼이 있고, 앞의스택 값이 존재한다면
let nextPage = nextStack.pop(); // 앞의스택 마지막 요소를 제거한 요소를 앞의 페이지에 할당해준다.
prevStack.push(current); // 뒤로가기 스택에 현재 페이지를 넣어준다.
current = nextPage; // 현재 페이지에 앞으로 가기한 페이지를 할당해준다
}else { // 만약에 순회하면서 발견된 요소가 UpperCase알파벳이라면 (새로운페이지)
prevStack.push(current);
current = actions[i];
nextStack = [];
}
}
return [prevStack, current, nextStack];
}
// 새로운 페이지 접속 => 앞으로 가기 버튼 비활성화
// + prevStack에 원래 있던 페이지를 넣고 , nextStack을 비운다 ([])
// 뒤로 가기 버튼(-1)을 누른 경우 => 원래 있던 페이지를 nextStack에 넣고,
// + prevStack의 top에 있는 페이지로 이동 한 뒤 , nextStack의 값을 pop한다. (FILO)
// 앞으로 가기 버튼 (1)을 누른 경우 => 원래 있던 페이지를 prevStack에 넣고,
// + nextStack의 top에 있는 페이지로 이동한 뒤 , nextStack의 값을 pop한다.
// 브라우저에서 뒤로가기, 앞으로 가기 버튼이 비활성화일 경우, Stack에 push 하지 않는다.
// 인터넷 브라우저에서 행동한 순서가 들어있는 actions Array와 시작 페이지 start가 주어질 때,
// 마지막에 접속해 있는 페이지와 방문했던 페이지들이 담긴 스택을 반환하는 솔루션을 만들자.
// Cautions
// 1. 새로운 페이지 접속 = UpperCase
// 2. 뒤로 가기 버튼 = -1
// 3. 앞으로 가기 버튼 = 1
// 다음 방문할 페이지는 항상 현재 페이지와 다른 페이지로 접속한다.
// 반환되는 출력값 배열의 첫 번째 요소 prevStack, 세 번째 요소 nextStack은 배열이다.
// + 스택을 사용자 정의 한다면, 출력에서는 배열로 변환 해야한다.