230414_Algorithm

majungha·2023년 4월 14일
1

알고리즘

목록 보기
25/71

오늘의 알고리즘 👍

📝 1. 크레인 인형뽑기 게임


  • 게임 화면은 "1 x 1" 크기의 칸들로 이루어진 "N x N" 크기의 정사각 격자이며 위쪽에는 크레인이 있고 오른쪽에는 바구니가 있습니다.
  • 각 격자 칸에는 다양한 인형이 들어 있으며 인형이 없는 칸은 빈칸입니다.
  • 모든 인형은 "1 x 1" 크기의 격자 한 칸을 차지하며 격자의 가장 아래 칸부터 차곡차곡 쌓여 있습니다.
  • 게임 사용자는 크레인을 좌우로 움직여서 멈춘 위치에서 가장 위에 있는 인형을 집어 올릴 수 있습니다.
  • 집어 올린 인형은 바구니에 쌓이게 되는 데, 이때 바구니의 가장 아래 칸부터 인형이 순서대로 쌓이게 됩니다.
  • 만약 같은 모양의 인형 두 개가 바구니에 연속해서 쌓이게 되면 두 인형은 터뜨려지면서 바구니에서 사라지게 됩니다.
  • 크레인 작동 시 인형이 집어지지 않는 경우는 없으나 만약 인형이 없는 곳에서 크레인을 작동시키는 경우에는 아무런 일도 일어나지 않습니다.

▷ 입출력 예

solution([[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]], [1,5,3,5,1,2,1,4]) // 4
  • 바구니에 담는 과정에서 터트려져 사라진 인형은 4개 입니다.

▷ 내 풀이

▷ 해결 못함 ❌

function solution(board, moves) {
  let basket = [];
  for (let i = 0; i < moves.length; i++) {
    for (let l = 0; l < board.length; l++) {
      if (board[l][moves[i] - 1] !== 0) {
        basket.push(board[l][moves[i] - 1]);
      }
    }
  }
  return basket;
}
// [ 4, 3, 3, 1, 2, 1, 1, 5, 4, 1, 3, 1, 2, 1, 4, 3, 2, 2, 5, 4, 3, 4, 3 ]
  • 시간만 더 있었으면 풀 수 있었을 것 같은데 너무 아쉽다..
  • 문제점 - 인형의 값을 basket에 담아줬었는데 moves만큼 인형의 값이 나와야하는데 더 많이 나왔다.

▷ 수업 풀이

function solution(board, moves) {
  const bucket = []; // 뽑은 인형을 저장하는 배열
  let answer = 0;

  // 1. 크레인이 이동하는 위치값을 구하는 반복문
  for (let i = 0; i < moves.length; i++) {
    // 2. 크레인이 이동해서 뽑아올 수 있는 인형의 위치값을 구하는 반복문
    for (let l = 0; l < board.length; l++) {
      const doll = board[l][moves[i] - 1];

      // 인형이 있는 격자가 빈칸(0)이 아니라면
      if (doll !== 0) {
        // 뽑아온 인형의 격자칸을 빈칸(0)으로 만들어 준다.
        board[l][moves[i] - 1] = 0;

        // 바구니에 넣으려고 하는 인형과 바구니의 마지막 인형이 동일한지 체크
        // === if(bucket[bucket.length - 1]){ // 가장 마지막 데이터를 가져옴
        if (bucket.at(-1) === doll) {
          answer += 2;
          bucket.pop(); // 마지막 데이터 제거
          break; // 지금 넣으려고하는 인형을 넣어주지 않기 위한 종료문
        }

        bucket.push(doll);
        break;
      }
    }
  }
  return answer;
}
  • 이차원 배열 문제가 나왔을 때 x좌표 y좌표를 활용하면 쉽게 접근할 수 있다.

▷ forEach 매서드 사용 풀이

function solution(board, moves) {
  const bucket = []; // 뽑은 인형을 저장하는 배열
  let answer = 0;

  moves.forEach((move) => {
    // forEach, map 같은 매서드는 break continue를 사용할 수 없다.
    let check = false; // 그래서 스위치 변수를 사용한다. 스위치 변수: 반복매서드를 실행시키지 않게 하는 변수

    board.forEach((location) => {
      const doll = location[move - 1];

      if (!check) {
        // check변수가 false일 때만 실행
        if (doll) {
          location[move - 1] = 0;

          if (bucket.at(-1) === doll) {
            answer += 2;
            bucket.pop();
          } else {
            bucket.push(doll);
          }

          check = true;
        }
      }
    });
  });
  return answer;
}

출처: 프로그래머스
출처: 코드캠프

profile
개발자 블로그 / 항상 겸손한 자세로 배우면서 성장하자 할 수 있다!

0개의 댓글