풀이
김영준
// 인형을 위에서 하나씩 뽑는다. // 같은 인형이 바구니에 들어오면 사라진다. // 인형이 없으면 아무 일도 일어나지 않는다. // 사라진 인형의 개수를 리턴 function solution(board, moves) { let count = 0; const basket = []; for (let i = 0; i < moves.length; i++) { let h = 0; let doll = 0; // 뽑은 인형이 0이 아니거나 최대 행까지 탐색할 때까지 반복 while (doll === 0 && h < board.length) { doll = board[h][moves[i] - 1]; // 스택이 비어있으면 비교하지 않고 push if(doll !== 0 && basket.length === 0 ){ basket.push(doll); board[h][moves[i] - 1] = 0; } // 스택이 비어있지 않고 뽑은 인형이 0이 아니고 바구니의 최상단 값과 다르면 바구니에 담는다. else if (doll !== 0 && basket[basket.length - 1] !== doll) { basket.push(doll); board[h][moves[i] - 1] = 0; // 뽑은 후 빈 곳이라는 것을 0으로 표시 } // 스택이 비어있지 않고 뽑은 인형이 0이 아니고 바구니의 최상단 값과 같으면 바구니에 push하지 않고 pop을 한다. else if (doll !== 0 && basket[basket.length - 1] === doll) { basket.pop(); board[h][moves[i] - 1] = 0; // 뽑은 후 빈 곳이라는 것을 0으로 표시 count += 2; // 두 인형이 만나서 사라졌으니 2 증가 } h++; } } return count; } // 뭐에 홀렸는지 pop 할 때는 0으로 재할당을 안 해줘서 몇 시간동안 헤매었네요..ㅠㅠ
이종현
function solution(board, moves) { let answer = 0; const stack = []; moves.forEach((move) => { for (let i = 0; i < board.length; i++) { const item = board[i][move - 1]; if (item === 0) continue; if (item === stack[stack.length - 1]) { stack.pop(); answer += 2; } else { stack.push(item); } board[i][move - 1] = 0; break; } }); return answer; }
박노철
function solution(board, moves) { //보드에서 맨위 하나를 들어서 바구니에 넣는다. 2개가 연속되면 사리진다. 바구니는 크기 제약x //board 인형이 놓인 상태, moves 집게 움직임 모두 작동시킨 후 사라진 인형개수 //배열 안의 0은 빈칸, /* [[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]] */ //움직임을 인덱스로 표현한다. const n=board.length; const idxMoves=moves.map(v=>v-1); // 집은 인형을 넣을 바구니 const basket=[]; //삭제한 카운트 let count=0; for(let l of idxMoves){ let h=0; //0이 아닌 숫자가 나올때까지 내려가기 while(h<n){ if(board[h][l] === 0)h++; else{ //0이아닌 숫자가 나오면 바구니에 넣고 0 넣어주기 basket.push(board[h][l]); board[h][l]=0; break; } } //바구니 검사 , 길이가 1보다 클때, 1,2번째 검사 같다면 두개 뽑아주고 count+2; if(basket.length>1 && (basket[basket.length-1] === basket[basket.length-2])){ basket.pop(); basket.pop(); count+=2; }; } return count }
이민희

function solution(board, moves) { const cols = Array.from(Array(board.length), () => new Array()) board.forEach(row => { row.forEach((item, colIdx) => { if (item !== 0) { cols[colIdx].unshift(item); } }) }) let cnt = 0; const stack = []; moves.forEach(move => { if (cols[move - 1].length > 0) { const targetItem = cols[move - 1].pop(); if (targetItem !== stack[stack.length - 1]) stack.push(targetItem); else { stack.pop(); cnt += 2; } } }) return cnt; }
박건우
// 인형이 없는 곳에 크레인이 내려오면 아무일도 일어나지 않는다. // 바구니는 충분히 크다. // 사라진 인형 개수 return function solution(board, moves) { let answer = 0; const stack = []; const size = board.length; moves.forEach(x => { x -= 1; //문제상 인덱스와 코드상 인덱스를 일치시켜줍니다. let y = 0; // 크레인의 y 위치입니다. 0이 제일 높은 곳입니다. while(y < size){ if(board[y][x]){ // 만약 인형이 있다면 if(stack[stack.length - 1] === board[y][x]){ //그 인형이 스택의 맨 위 요소와 같다면 stack.pop(); //터뜨려줍니다. answer += 2; }else{ //같지 않다면 stack.push(board[y][x]); //쌓아줍니다. } board[y][x] = 0; //인형을 제거합니다. break; //이거 처음에 빼먹었다가 좀 헤맸어요 인형 하나 뽑고 멈춰야합니다. } y++; // 인형을 찾을때 까지 크레인은 아래로 내려가야 합니다. } }) return answer; } // 스택 문제의 공통점이 이제 어느정도 보이는 것 같습니다.
박주연
function solution(board, moves) { //뽑은 인형을 담는 스택 const stack = []; const newBoard = Array.from(Array(board.length), () => new Array()); let result = 0; /* 성능 비교 : for loop ≒ forEach > for...of 2차원 배열을 다른 방식으로 보기 편하게 변경 [[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]] */ // [[3,4],[5,2,2],[1,4,5,1],[3,4],[1,2,1,3]] for(let i = board.length-1 ; i>= 0 ; i--){ for(let j = 0 ; j< board.length; j++){ if(board[i][j] !== 0){ newBoard[j].push(board[i][j]) } } } for(const i of moves){ const num = newBoard[i-1].pop() //크레인이 뽑을 것이 있는 경우만 처리하도록 예외처리 if(num){ //stack의 top과 비교하면서 값이 같으면 +2 if(stack[stack.length-1] === num){ stack.pop(); result += 2; }else{ stack.push(num) } } } return result; }