2022/02/09) 3. 크레인 인형뽑기 [자료구조(스택, 큐)]

굥굥이·2022년 2월 9일
0
post-thumbnail

1. 문제

<크레인 인형뽑기>
: 크레인을 좌우로 움직여서 멈춘 위치헤서 가장 위에 있는 인형을 집어 올릴 수 있다. 집어올린 인형은 바구니에 쌓이게 되는데, 이때 바구니의 가장 아래칸부터 인형이 순서대로 쌓이게 된다. 만약 같은 모양의 인형 두 개가 연속해서 쌓이게 되면 두 인형은 떠뜨려지면서 바구니에서 사라지게 된다.
터트려서 사라진 인형의 개수를 return하는 함수를 만들어라.
(1~100 각 숫자는 각기 다른 인형의 모양을 의미한다.)

2. 해결 방법

  1. 열을 기준으로 행을 돌린다. (forEach와 for문 사용)
  2. 그 값이 stack에 있는 값과 연속일 수도 있으므로, 일단 무조건적으로 stack에 push하지 말고 tmp에 담아 놓고 0으로 바꾸기만 한 뒤, stack에 있는 값과 비교 후 연속이면 pop과 answer += 2;를 해주고, 연속이 아니라면 그냥 push해준다.
  3. 열에서 인형을 찾아서(0이 아닌 거) 빼줬으면, 이제 다른 열에 가서 인형을 빼줘야 하므로 break를 해줘야 한다.
    말이 이상한데 예를 들어 1,5,3,5..는 1번에 있는 인형을 뽑아, 5번에 있는 인형을 뽑으라는 말이니, 1번(열)에 있는 인형을 뽑았으니 break를 하라는 말이다.

! 개념
-> forEach : for문 대체할 수 있는 거

3. 정답

        <script>
            function solution(board, moves){
                let answer = 0;
                let stack = [];
                moves.forEach(pos => { //1,5,3,5,..  for문 대체할 수 있음! [열]
                    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; //0으로 바꾸기
                            if(tmp===stack[stack.length-1]){ //비교
                                stack.pop(); //같은 인형이 연속이면 pop
                                answer+=2;
                            }else stack.push(tmp); //같은 인형이 아니라면 push
                            break; //뺐으면 해당 열의 for문 스탑
                        }
                    }
                });       
                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>

4. 내 코드와 비교 그리고 반성

아나 꾸준히 해야 하는데 제발 정신 좀 차리셈.. 제대로 풀지도 못하고 성실하지도 못하고 진짜 이 엉터리놈아 제대로 좀 하자

profile
아자아자 파이띵굥!

0개의 댓글