[Stack] 문제풀기

김병훈·2021년 7월 22일
0

section2

목록 보기
3/6
  1. 뒤로 가기와 앞으로 가기 스택의 변수를 설정한다.
let prevStack = [];
let nextStack = [];
let current = start;
  1. action 배열을 모두 순회하기 위해서 반복문을 설정해준다.
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은 배열이다.
  // + 스택을 사용자 정의 한다면, 출력에서는 배열로 변환 해야한다.
profile
블록체인 개발자의 꿈을 위하여

0개의 댓글