[TIL] 211114

Lee Syong·2021년 11월 14일
0

TIL

목록 보기
88/204
post-thumbnail

📝 오늘 한 것

  1. 프로그래머스 문제 풀이 - 크레인 인형뽑기 게임

📚 배운 것

1. 프로그래머스 문제 풀이

1) 크레인 인형뽑기 게임

2019 카카오 개발자 겨울 인턴십 문제

(1) 내가 생각한 로직

  • 먼저, moves 배열의 요소의 값이 1인 경우에 board 배열의 '첫 번째' 요소(하위 배열)의 1번째 요소(인덱스 0)의 값이 0인지 아닌지 확인한다

  • 만약 0이 아니라면, 그 값을 꺼내서 basket 배열에 push 한다.
    이때 만약 basket 배열의 i 요소와 i-1의 요소가 같다면 두 요소를 pop하고, deleteNum 변수의 값을 +2 한다.
    그 후, moves 배열의 다음 요소의 값을 가져온다.

  • 만약 0이라면, board 배열의 '두 번째' 요소(하위 배열)의 1번째 요소(인덱스 0)의 값이 0인지 아닌지 확인한다.
    0이 아닐 때까지 반복한다.
    board 배열의 마지막 요소의 1번째 요소(인덱스 0)마저 0이라면, moves 배열의 다음 요소의 값을 가져온다.

  • moves 배열의 마지막 요소까지 반복한다.


(2) 내가 작성한 풀이

const basket = [];
moves.reverse();
let cranePosition = moves.pop() - 1;
let movesLength = moves.length;
let deleteNum = 0;
  • 뽑은 인형을 담아줄 빈 바구니를 의미하는 basket 배열과 크레인 이동 위치를 의미하는 cranePosition 변수, 터진 인형의 개수를 의미하는 deleteNum 변수를 만들어줬다.

  • 크레인을 이동할 때마다 계속 shift()를 쓰는 것보다 처음에 1번만 reverse()를 해주고 pop()을 쓰는 게 효율성 면에서 좋다고 생각했다.

const dollNum = board[i][cranePosition];
for (let i = 0; i < board.length; i++) {
  if (dollNum !== 0) {
   basket.push(dollNum);
   board[i][cranePosition] = 0;
  }
}
  • dollNum(인형 번호)가 0이 아니라면, basket 배열(바구니)에 push 한다. 이때 해당 인형은 바구니로 옮겨져 원래 자리에서 사라졌으므로 해당 인형이 있던 자리의 값을 0으로 바꿔준다.
if (basket.length > 1) {
  const last = basket.pop();
  const secondToLast = basket.pop();
  if (last === secondToLast) {
    deleteNum = deleteNum + 2;
  } else {
    basket.push(secondToLast);
    basket.push(last);
  }
}
  • 바구니에 인형이 2개 이상 들어 있을 때, 맨 위에 있는 인형과 그 아래에 있는 인형을 꺼내 비교한다. 둘이 같은 인형이면 그대로 터뜨리고, 터진 인형의 개수는 +2가 된다. 둘이 다른 인형이면 다시 바구니에 나중에 꺼낸 것부터 넣어준다.
let cranePosition = moves.pop() - 1;
let movesLength = moves.length;

while (movesLength >= 0) {
  for (let i = 0; i < board.length; i++) {
    const dollNum = board[i][cranePosition];
    if (dollNum !== 0) {
      // 중략
      break;
    }
  }
  cranePosition = moves.pop() - 1;
  movesLength--;
}
  • 인형 번호가 0이 아니라면, 해당 번호를 basket 배열에 담아준 후 크레인이 바로 다음 위치로 이동할 수 있도록 break를 사용해 for 반복문을 탈출하도록 한다. 그 후 크레인의 위치(cranePosition)를 바꾸고, while 반복문 조건이 맞는 한 위의 작업을 반복한다.

  • moves.length가 0보다 작아지면 크레인이 작동을 끝낸 것이므로 while 반복문을 탈출하도록 한다.

(3) 최종 코드

function solution(board, moves) {
  const basket = [];
  moves.reverse();
  let cranePosition = moves.pop() - 1;
  let movesLength = moves.length;
  let deleteNum = 0;

  while (movesLength >= 0) {
    for (let i = 0; i < board.length; i++) {
      const dollNum = board[i][cranePosition];
      if (dollNum !== 0) {
        basket.push(dollNum);
        board[i][cranePosition] = 0;
        if (basket.length > 1) {
          const last = basket.pop();
          const secondToLast = basket.pop();
          if (last === secondToLast) {
            deleteNum = deleteNum + 2;
          } else {
            basket.push(secondToLast);
            basket.push(last);
          }
        }
        break;
      }
    }
    cranePosition = moves.pop() - 1;
    movesLength--;
  }

  return deleteNum;
}

✨ 내일 할 것

  1. 강의 듣기
profile
능동적으로 살자, 행복하게😁

0개의 댓글