JS 알고리즘 문제풀이/섹션 6. 자료구조(스택, 큐)

3.크레인 인형뽑기(스택):카카오

crab. 2022. 6. 24. 08:32

📌강의 정리

forEach와 반복문을 사용해서 주어진 2차원 배열에서 0이 아닐때까지 반복했다가

0이 아니면 그 숫자를 stack에 넣어주되 넣기전에 그 숫자가 stack에 쌓여있던 숫자와

같은지 비교하고 같으면 answer+=2하고 아니면 그냥 stack에 넣어준다.

 

📌느낀점

이번문제는 문제의 이해에서 두번 돌아갔다.

알고리즘 또한 막 어려운건 없지만 세세하게 까다로운 조건들이 있었으며

그래서 시간이 조금 오래걸린것같다..

forEach를 썼다면 조금 더 편했을 수 있었기에 항상 메서드들을 잘 활용할 줄 알아야겠다.

//나의코드
<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function solution(board, moves) {
        let answer = 0;
        let stack = [];
        let len = board.length;
        let newBoard = [];
        let tmp = [];
        let tmp2 = 0;
        for (let i = 0; i < len; i++) {
          for (let j = len - 1; j >= 0; j--) {
            tmp.push(board[j][i]);
          }
          newBoard.push(tmp);
          tmp = [];
        }
        console.log(newBoard);
        for (let x of moves) {
          while (tmp2 === 0) {
            tmp2 = newBoard[x - 1].pop();
          }
          if (stack[stack.length - 1] === tmp2) {
            stack.pop();
            answer += 2;
            tmp2 = 0;
            continue;
          } else {
            if (tmp2 == undefined) {
              tmp2 = 0;
              continue;
            }
            stack.push(tmp2);
            tmp2 = 0;
          }
        }
        return answer;
      }

      //움직임은 이미 모두 결정되어져 있다.
      //결과를 도출해내야 한다.
      //주어진 배열을 다시 편집하기 쉽게 재구성한다.
      //이중 반복을 이용해서 처음 반복은 a[0]의 길이만큼 반복하고
      //두번째 반복은 a의 길이만큼 반복하며 이때 끝에서부터 0으로 오는 식으로
      //배열을 만들어 주어야 한다.
      //이 배열이 다 만들어지면 이 배열을 바탕으로 stack에 push와 pop을 반복하여 문제를 해결한다.

      let a = [
        [0, 0, 0, 0, 0],
        [0, 0, 1, 0, 3],
        [0, 2, 5, 0, 1],
        [4, 2, 4, 4, 2],
        [3, 5, 1, 3, 1],
      ];

      let b = [1, 5, 3, 5, 1, 2, 1, 4];
      console.log(solution(a, b));
    </script>
  </body>
</html>
//강사님 코드
<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function solution(board, moves) {
        let answer = 0;
        let stack = [];
        moves.forEach((pos) => {
          for (let i = 0; i < board.length; i++) {
            if (board[i][pos - 1] !== 0) {
              let tmp = board[i][pos - 1];
              board[i][pos - 1] = 0;
              if (tmp === stack[stack.length - 1]) {
                stack.pop();
                answer += 2;
              } else stack.push(tmp);
              break;
            }
          }
        });

        return answer;
      }

      let a = [
        [0, 0, 0, 0, 0],
        [0, 0, 1, 0, 3],
        [0, 2, 5, 0, 1],
        [4, 2, 4, 4, 2],
        [3, 5, 1, 3, 1],
      ];

      let b = [1, 5, 3, 5, 1, 2, 1, 4];
      console.log(solution(a, b));
    </script>
  </body>
</html>