오늘의 알고리즘 👍
📝 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개 입니다.
▷ 내 풀이
▷ 해결 못함 ❌
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;
}
- 시간만 더 있었으면 풀 수 있었을 것 같은데 너무 아쉽다..
- 문제점 - 인형의 값을 basket에 담아줬었는데 moves만큼 인형의 값이 나와야하는데 더 많이 나왔다.
▷ 수업 풀이
function solution(board, moves) {
const bucket = [];
let answer = 0;
for (let i = 0; i < moves.length; i++) {
for (let l = 0; l < board.length; l++) {
const doll = board[l][moves[i] - 1];
if (doll !== 0) {
board[l][moves[i] - 1] = 0;
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) => {
let check = false;
board.forEach((location) => {
const doll = location[move - 1];
if (!check) {
if (doll) {
location[move - 1] = 0;
if (bucket.at(-1) === doll) {
answer += 2;
bucket.pop();
} else {
bucket.push(doll);
}
check = true;
}
}
});
});
return answer;
}
출처: 프로그래머스
출처: 코드캠프