JS - 자료구조 실습 (Stack, Queue)

김도영·2022년 5월 18일
0
post-thumbnail
post-custom-banner

Stack 실습 - 브라우저 뒤로가기, 앞으로 가기 구현

  • 새로운 페이지로 접속할 경우 prev 스택에 원래 있던 페이지를 넣고 next 스택을 비운다.
  • 뒤로 가기 버튼을 누를 경우 원래 있던 페이지를 next 스택에 넣고 prev 스택의 top에 있는 페이지로 이동한 뒤 prev 스택의 값을 pop 한다.
  • 앞으로 가기 버튼을 누를 경우 원래 있던 페이지를 prev 스택에 넣고 next 스택의 top에 있는 페이지로 이동한 뒤 next 스택의 값을 pop 한다.
  • 브라우저에서 뒤로 가기, 앞으로 가기 버튼이 비활성화일 경우(클릭이 되지 않을 경우)에는 스택에 push 하지 않는다.
  • 인터넷 브라우저에서 행동한 순서가 들어있는 배열 actions와 시작 페이지 start가 주어질 때 마지막에 접속해 있는 페이지와 방문했던 페이지들이 담긴 스택을 반환하는 솔루션을 만들어보자

    function browserStack(actions, start) {
      // TODO: 여기에 코드를 작성합니다.
      if ( typeof start !== 'string') {
        return false;
      }
    
    // 뒤로기가 앞으로가기 변수
      let prevStack = [];
      let nextStack = [];
      let now = start;
    
      for (let i = 0; i < actions.length; i++ ) {
        // -1 (뒤로가기), prevStack 에 이전페이지가 있을경우
        if ( actions[i] === -1 && prevStack.length !== 0 ) {
          // prevStack에서 pop를 한 요소를 이전페이지에 할당
          // nextStack에는 현재페이지
          // 현재 페이지를 이전페이지에 할당
          let prevPage = prevStack.pop();
          nextStack.push(now);
          now = prevPage;
        }
    
        // 1(앞으로 가기), 다음 페이지가 있을경우
        else if ( actions[i] === 1 && nextStack.length !== 0 ) {
          // nextStack에서 pop를 한 요소를 다음페이지에 할당
          // prevStack에 현재페이지
          // 현재페이지를 다음페이지에 할당
          let nextPage = nextStack.pop();
          prevStack.push(now);
          now = nextPage;
        }
        // 새로운페이지
        else if( typeof actions[i] === 'string' ) {
          // prevStack에 현재페이지를 삽입
          // 현재페이지에 string요소 할당
          // 새로운 페이지이기때문에 다음페이지는 비어있음
          prevStack.push(now);
          now = actions[i];
          nextStack = [];
        }
      }
      
      return [prevStack, now, nextStack];
    }

    Queue - 박스 포장

    마트에서 장을 보고 박스를 포장하려고 한다. 박스를 포장하는 데는 폭이 너무 좁고, 그렇기에 한 줄로 서 있어야 하는데 다음과 같은 조건을 만족해야 한다.

  • 들어온 순서대로 한 명씩 나가야 한다.
  • 뒷사람이 포장을 전부 끝냈어도 앞사람이 끝내지 못하면 기다려야 한다.
  • 앞사람이 포장을 끝내면, 포장을 마친 뒷사람들과 함께 한 번에 나가게 된다.
  • ex) 만약, 앞사람의 박스는 5 개고, 뒷사람 1의 박스는 4 개, 뒷사람 2의 박스는 8 개라고 가정했을 때, 뒷사람 1이 제일 먼저 박스 포장을 끝내게 되어도 앞사람 1의 포장이 마칠 때까지 기다렸다가 같이 나가게 된다. 이때, 통틀어 최대 몇 명이 한꺼번에 나가는지 알 수 있도록 함수를 구현해보자.

    function paveBox(boxes) {
      // TODO: 여기에 코드를 작성합니다.
      let success = [];
      
      while ( boxes.length > 0 ) {
        // ex)5,1,4,6이 있다면 boxes[0]인 5보다 큰 6. 6이 가리키는 index 3. 3을 finish에 넣어준다.
        let finish = boxes.findIndex ( el => boxes[0] < el);
        
        if(finish === -1){
          // 만약 찾지 못했다면 success에 boxes 배열의 길이를 넣은 후, boxes 내부의 요소를 모두 삭제
          success.push(boxes.length);
          boxes.splice(0, boxes.length);// 한꺼번에 빠져나간만큼 지운다.
    
            } 
        else {
          // 만약 찾았다면, 해당 인덱스를 success에 넣고, boxes에서 그만큼 제외
          success.push(finish);
          boxes.splice(0, finish);
        }
      }
    
        return Math.max(...success);
    }
    profile
    Blockchain Developer
    post-custom-banner

    0개의 댓글