2019 카카오 개발자 겨울 인턴십 문제
먼저, 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 배열의 마지막 요소까지 반복한다.
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;
}
}
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);
}
}
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 반복문을 탈출하도록 한다.
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;
}