stack_브라우저 뒤로 가기 앞으로 가기

mingyu Lim·2023년 4월 3일

코딩테스트

목록 보기
17/32

문제

stack을 이용하여 브라우저의 뒤로 가기와 앞으로 가기를 구현하시오.

조건

매개 변수

  • actions = 새로운 사이트, 뒤로 가기, 앞으로 가기 등 사용자가 사이트를 이용한 기록의 배열
  • start = 시작 페이지
  1. 새로운 페이지로 접속할 경우 prev 스택에 원래 있던 페이지를 넣고 next 스택을 비웁니다.

  2. 뒤로 가기 버튼을 누를 경우 원래 있던 페이지를 next 스택에 넣고 prev 스택의 top에 있는 페이지로 이동한 뒤 prev 스택의 값을 pop 합니다.

  3. 앞으로 가기 버튼을 누를 경우 원래 있던 페이지를 prev 스택에 넣고 next 스택의 top에 있는 페이지로 이동한 뒤 next 스택의 값을 pop 합니다.

  4. 브라우저에서 뒤로 가기, 앞으로 가기 버튼이 비활성화일 경우(클릭이 되지 않을 경우)에는 스택에 push 하지 않습니다.

주의 사항

  • 만일 start 값의 인자로 string이 아닌 경우 false 리턴
  • 뒤로 가기 버튼 : -1
  • 앞으로 가기 버튼 : 1
  • 출력 값은 [[prev], still, [next]]로 출력한다.

입출력 예시

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

  • 이전 배열, 현재, 다음 배열을 구현한다.

  • 반복문

    • 요소가 문자열인 경우 : 새로운 홈페이지
    • -1 : 뒤로가기 구현
    • 1 : 앞으로 가기 구현
  • 위의 조건 사항에 맞게 하나씩 케이스를 적용 시켜준다.

코드

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
}

0개의 댓글