Stack 뒤로가기, 앞으로가기 Javascript

cptkuk91·2022년 8월 20일
3

Algorithm

목록 보기
69/161
post-custom-banner

문제

개발자가 되고 싶은 김코딩은 자료구조를 공부하고 있습니다. 인터넷 브라우저를 통해 스택에 대해 검색을 하면서 다양한 페이지에 접속하게 되었는데 "뒤로 가기", "앞으로 가기"를 반복하면서 여러 페이지를 참고하고 있었습니다.
그런데 새로운 페이지를 접속하게 되면 "앞으로 가기" 버튼이 비활성화돼서 다시 보고 싶던 페이지로 갈 수 없었습니다. 이러기를 반복하다가 김코딩은 스택 자료구조를 떠올리게 되었습니다.
브라우저에서 "뒤로 가기", "앞으로 가기" 기능이 어떻게 구현되는지 궁금해진 김코딩은 몇 가지 조건을 아래와 같이 작성하였지만, 막상 코드를 작성하지 못하고 있습니다.

조건

  1. 새로운 페이지로 접속할 경우 prev 스택에 원래 있던 페이지를 넣고 next 스택을 비웁니다.
  2. 뒤로 가기 버튼을 누를 경우 원래 있던 페이지를 next 스택에 넣고 prev 스택의 top에 있는 페이지로 이동한 뒤 prev 스택의 값을 pop 합니다.
  3. 앞으로 가기 버튼을 누를 경우 원래 있던 페이지를 prev 스택에 넣고 next 스택의 top에 있는 페이지로 이동한 뒤 next 스택의 값을 pop 합니다.
  4. 브라우저에서 뒤로 가기, 앞으로 가기 버튼이 비활성화일 경우(클릭이 되지 않을 경우)에는 스택에 push 하지 않습니다.

주의 사항

  • 만약 start의 인자로 string 자료형이 아닌 다른 자료형이 들어온다면 false를 리턴합니다.
  • 새로운 페이지 접속은 알파벳 대문자로 표기합니다.
  • 뒤로 가기 버튼을 누른 행동은 -1로 표기합니다.
  • 앞으로 가기 버튼을 누른 행동은 1로 표기합니다.
  • 다음 방문할 페이지는 항상 현재 페이지와 다른 페이지로 접속합니다.
  • 방문한 페이지의 개수는 100개 이하입니다.
  • 반환되는 출력값 배열의 첫 번째 요소 prev 스택, 세 번째 요소 next 스택은 배열입니다. 스택을 사용자 정의한다면 출력에서는 배열로 변환해야 합니다.

입출력 예시

const actions = ["B", "C", -1, "D", "A", -1, 1, -1, -1];
const start = "A";
const output = browserStack(actions, start);

console.log(output); // [["A"], "B", ["A", "D"]]

const actions2 = ["B", -1, "B", "A", "C", -1, -1, "D", -1, 1, "E", -1, -1, 1];
const start2 = "A";
const output2 = browserStack(actions2, start2);

console.log(output2); // [["A", "B"], "D", ["E"]]

풀이

function solution (actions, start) {
	let prevStack = [];
   	let nextStack = [];
    let current = start;
    
    // start 인자가 string 아닐 경우 false를 리턴해야한다.
    if(typeof(start) !== 'string'){
    	return false;
    }
    
    
    for(let i = 0; i < actions.length; i++){
    	// -1을 누르면 뒤로가기, 뒤로가기는 뒤로 갈 페이지가 존재해야한다.
		if(actions[i] === -1 && prevStack.length !== 0){
        	let prevPage = prevStack.pop();
            nextStack.push(current);
            current = prevPage;
        }
	    // 1을 누르면 앞으로가기, 앞으로가기 할 페이지가 존재해야한다.
        else if(actions[i] === 1 && nextStack.length !== 0){
        	let nextPage = nextStack.pop();
            prevStack.push(current);
            current = nextPage;
        }
    	// actions[i] 타입은 'string'일 때 새로운 페이지를 넣어준다.
        else if(typeof(actions[i]) === 'string'){
        	prevStack.push(current);
            current = actions[i];
            nextStack = [];
        }
    }
    return [prevStack, current, nextStack];
}

actions 배열 내 요소가 -1이면 뒤로가기입니다. 이때 뒤로갈 페이지가 존재해야합니다.
따라서 반복문 내에서 actions[i] === -1 && prevStack.length !== 0 이라는 조건이 성립된다면, prevPage = prevStack.pop(); prevStack 배열에서 하나를 pop합니다. 뒤로가기를 한 경우에는 다음 페이지가 존재합니다. 따라서 nextStack.push(current) 현재 내가 보고 있는 페이지는 다음페이지에 넣어줍니다.
current = prevPage 내가 현재 보는 페이지는 이전 페이지로 왔기 때문에 현재페이지는 prevPage를 담아줍니다.

만약 actions 배열의 요소가 알파벳이라면, prevStack.push(current) 넣어줍니다. 새로운 페이지를 열었기 때문에 보고있던 페이지는 전 페이지가 됩니다.
current = actions[i]가 됩니다.
새로운 페이지를 열었기 때문에 nextStack = [] 빕니다.

profile
메일은 매일 확인하고 있습니다. 궁금하신 부분이나 틀린 부분에 대한 지적사항이 있으시다면 언제든 편하게 연락 부탁드려요 :)
post-custom-banner

0개의 댓글