본문 바로가기
codes/자료구조

[Stack] 브라우저 뒤로가기 앞으로가기

by Mia_ 2023. 1. 12.
function browserStack(actions, start) {
  // actions : 인터넷 브라우저에서 행동한 순서가 들어았는 배열 // const actions = ["B", "C", -1, "D", "A", -1, 1, -1, -1];
  // start : 시작 페이지 // const start = "A";
  // TO DO : actions, start가 주어질 때 마지막에 접속해 있는 페이지와 방문했던 페이지들이 담긴 스택을 반환하는 솔루션 만들기
  // 뒤로가기 -> -1, 앞으로가기 -> 1
  // 반환되는 출력값 배열의 첫 번째 요소 -> prev 스택 배열, 세번째 요소 -> next 스택 배열
  // output = browserStack(actions, start) --> [["A"], "B", ["A", "D"]]

  let prev = [];
  let next = [];
  let current = start; // 마지막에 접속해 있는페이지 리턴할 값임

  // 액션 배열 순회하면서 확인..?
  // 우선 자료형으로 분기
  if(typeof start !== 'string'){ return false }

  // 액션 배열 순회하면서 
  // 1. typeof 문자열을 만나면 새 페이지 킨거임 next 스택이 비워짐
  // 2. -1 만나면 뒤로 가기 페이지, preve 스택에서 pop
  // 3. 1 만나면 앞으로 가기, next 스택에서 pop

  for(let i = 0; i < actions.length; i++){

    // -1, 뒤로가기 
    // 원래 있던 페이지를 next 스택에 넣고, 
    // prev 스택의 top 페이지로 이동한 뒤 prev 스택의 값을 pop
    if(actions[i] === -1 && prev.length !== 0){
      // 얘가 빈 배열일 경우도 고려 - pending
      let prevPage = prev.pop();
      next.push(current);
      current = prevPage;
    }

    // 1, 앞으로 가기
    // 원래 있던 페이지를 prev 스택에 넣고
    // next 스택의 top에 있는 페이지로 이동한 뒤 next 스택의 값을 pop
    else if(actions[i] === 1 && next.length !== 0){
      // next 배열이 빈 배열 경우도 고려 - 이따 생각하자
      let nextPage = next.pop();
      prev.push(current);
      current = nextPage;
    }


    // 순회하다가 만난 것이 문자열임
    // 완전 새 페이지 
    // 넥스트 스택 비워주고 바로 현재 페이지로 지정
    // prev 스택은 있으니까 current를 prev를 넣어줌
    else if(typeof(actions[i]) === 'string'){
      prev.push(current)
      next = [];
      current = actions[i]
    }
    
  }
  return [prev, current, next]  

}

'codes > 자료구조' 카테고리의 다른 글

[Stack] 구현  (0) 2023.02.12
[Queue] 구현  (0) 2023.01.15
[Stack] 구현  (0) 2023.01.15