[ 06.16 ] 크레인 인형뽑기

프로그래머스 1단계
난이도 🌟
(라고 하지만 나한텐 개어려웠음. 하하)

function solution(board, moves) {
    var answer = 0;
    return answer;
}

문제 핵심

  1. 최소 5 x 5 에서 30 x 30 사이의 칸이 있다. (board)
  2. 집게의 위치를 가르키는 moves 는 맨위 칸에 있는 인형만 뽑을 수 있다.
  3. 뽑은 기계는 빈 스택에 하나씩 쌓이게 된다.
  4. 빈 스택에 쌓인 인형의 종류가 이전의 인형과 같다면 사라진다.
  5. 사라진 인형의 수를 구한다.

1. 입출력 예시의 이해.
0은 인형이 없는 상태이다.
집게의 위치가 1번째 위치하는 것들을 검사 하다가
(0은 인형이 없는 경우니까 패스) 4를 만나면, 빈스택에 4를 추가해 준다.
마찬가지로 moves의 두번째 인덱스인 5.
그러니까 board 의 다섯번째 숫자들을 하나씩 탐색했을 때 0이 아닌 숫자가 나오면 그 숫자를 빈 스택에 차례대로 담게된다.

**여기까지 보면, moves 안에 들어있는 배열들은 몇번째인지 나타내어 주지만,
board 의 인덱스에 접근하기 위해서는 -1씩 해줘야 한다.
moves : [1,5,3,5,1,2,1,4]
moves 의 첫번째(1) 은 board 의 0번째 인덱스.

이런식으로 moves 가 움직이는 만큼, 집게가 가르키는 숫자에서 board 를 찾고, 그 board 에 인형이 있다면 (0이 아니면) 빈스택에 추가.
빈스택에 추가 했을 때 같은 숫자가 나오면 지워주고 그 지운 숫자를 구한 값이 result 가 되는것이다.

2. 수도코드 작성해보기.

(1) 필요한 변수 생각해보기
-> let result = 0; // 중복되어 뺀 값을 최종 리턴하기 위해서.
-> let basket = [] // 뽑은 인형들을 새로운 스택에 담기위한 변수.
-> let lastIdx = 0; // board인덱스의 뽑힐, 마지막 인덱스 변수.

(2) moves는 해당 length 만큼 움직이게 된다.-> for 문.
-> let selected = moves[i]-1 변수를 지정해두면 편하다.
selectedDoll = 0; // 선택된 인형갯수 카운트 예정.
앞서 말했듯이, board 는 0번째부터 시작하는 인덱스에 해당하기 때문에 moves 배열에 작성되어있는 갯수와 매치되려면 -1을 해주어야 한다.

(3) board 의 length 만큼 반복
-> 해당 인덱스의 lastIdx 를 찾아주기 위한 for문이 하나 더 필요.
만약 board 의 인덱스중 moves 가 지정한 위치 부분이 0 이 아니라면, selectedDoll 은 board 의 인덱스의 마지막 부분이 된다.

(4) basket 에 쌓인 인형들이 중복이 된다면? ?
-> 차곡차곡 쌓인 selectedDoll 이 그다음 쌓인 lastIdx 와 값이 같다면, pop 을 해줌과 동시에 result 의 값은 +2 가 된다.
(중복이 되었다는것은 인형 두개가 동시에 소멸된것이나 마찬가지기 때문.)
값이 같지 않다면 계속적으로 push 를 해준다.
(5) 마지막으로 선택된 보드의 요소가 0이면 break 을 해준다.

이 모든것을 종합해 보았을 때, 다음과 같은 코드로 작성할 수 있다.

function solution(board, moves) {
    let result = 0; //중복되서 뺀 수의 최종 점수
    let basket = []; // 새로 담을 배열
    let lastIdx = 0; // basket의 마지막 인덱스
    
    for(let i = 0; i<moves.length; i++){
        for(let j = 0; j<board.length; j++){
            let selected = moves[i]-1;
            let selectedDoll = 0;
            if(board[j][selected] !== 0){
                //선택된 인형은 최소 1부터 시작이므로, 
                selectedDoll = board[j][selected];
                //마지막 배열은 basket 의 0번째 배열이 되고 그 위에 순차적으로 쌓이게 된다.
                lastIdx = basket.length-1
                //순차적으로 쌓인 인덱스에 만약 선택된 인형이 맨위에 온 인덱스에 겹치게 되면 
                if(selectedDoll === basket[lastIdx]){
                    basket.pop();
                    result += 2
                }else{
                    basket.push(selectedDoll)
                }
                board[j][selected] = 0;
                break;
            }
        }
    }
    return result;
}

좋은 웹페이지 즐겨찾기