[Programmers] 크레인 인형 뽑기 게임

크레인 인형 뽑기 게임 - JavaScript 풀이


👉 programmers 문제 링크


문제풀이 로직

  1. moves 배열의 맨 앞에서부터 숫자를 1개씩 꺼낸다.
  2. 1에서 꺼낸 숫자를 2차원 배열 board의 두번째 인덱스로 지정하고, 첫번째 인덱스 값을 변화시키며 값을 확인한다.

    2-1. 해당 열에 0이 아닌 요소가 있으면, 그 값을 리턴하고 해당 요소의 값은 0으로 변경
    2-2. 해당 열에 0이 아닌 요소가 없으면, 0을 리턴
  3. 2에서 확인한 숫자를 별도의 컨테이너 행렬에 저장
    3-1. 2에서 뽑은 숫자가 0이면 컨테이너에 저장하지 않는다.
    3-2. 2에서 뽑은 숫자가 0이 아니고, 컨테이너가 비어있다면 숫자를 그냥 저장한다.
    3-3. 2에서 뽑은 숫자가 0이 아니고, 컨테이너가 비어있지 않다면 컨테이너의 마지막 숫자와 2에서 뽑은 숫자를 비교한다.
    3-3-1. 비교한 숫자가 다르면 숫자를 그냥 저장한다.
    3-3-2. 비교한 숫자가 같으면 컨테이너의 마지막 수를 제거하고 count 변수의 값을 2 증가시킨다.
  4. 1~3 과정을 moves 배열의 길이만큼 반복한다. 상기의 로직을 코드로 구현하면 다음과 같다.
    function solution(board, moves) {
      let count = 0;
      const boardLength = board.length; // 반복문 시행 시 매번 length를 계산하지 않도록 미리 변수로 설정
      const movesLength = moves.length; // 반복문 시행 시 매번 length를 계산하지 않도록 미리 변수로 설정
      const container = []; // 뽑은 숫자(인형)을 저장할 별도의 배열
      
      // 2차원 배열 board에서 숫자를 확인해서 뽑는 과정을 구현한 함수
      const selectNumber = function(seletedColumn){
          for(let i = 0; i < boardLength; i++){
              // 선택 된 열의 모든 행의 값을 확인하며 0이 아닌 수를 찾는 과정 
              if(board[i][seletedColumn]){
                  const result = board[i][seletedColumn]; // 0이 아닌수를 result에 저장
                  board[i][seletedColumn] = 0; // 해당 요소의 값은 0으로 변경 (인형이 제거됨을 의미)
                  return result; // result를 리턴
              }
          }
          return 0; // 0이 아닌 값을 찾지 못했다면 0을 리턴 (해당 열에는 인형이 없음을 의미)
      }
      
      // 뽑은 숫자(인형)을 별도의 컨테이너에 저장하는 과정을 구현한 함수
      const pushToContainer = function(selectedNumber){
          // 1. 뽑은 숫자가 0이면 함수를 종료한다.
          if(!selectedNumber) return;
          // 2. 컨테이너가 비어있다면 숫자를 그냥 저장한다.
          if(container.length === 0){
              container.push(selectedNumber);
              return; 
          }
          // 3. 컨테이너가 비어있지 않다면 기존 저장된 숫자와 새로 뽑은 숫자를 비교한다.
          // 3-1. 비교한 숫자가 다르면 숫자를 그냥 저장한다.
          // 3-2. 비교한 숫자가 같으면 컨테이너의 마지막 숫자를 제거하고 count의 값을 2 증가시킨다.
          if(selectedNumber !== container[container.length-1]){
              container.push(selectedNumber);
              return;
          } else if(selectedNumber === container[container.length-1]){
              container.pop();
              count+=2;
              return;
          }
      }
      
      // 실제 코드 동작부 - moves 배열의 원소를 순회하며 selectNumber 함수와 pushToContainer 함수를 호출
      for(let i = 0; i < movesLength; i++){
          const seletedColumn = moves[i]-1;
          pushToContainer(selectNumber(seletedColumn));
      }
      
      return count;
    }

좋은 웹페이지 즐겨찾기