🔎 문제
🧩 구현과정 및 코드
개인 토글 영역에 구현 과정과 코드를 자유롭게 작성해주시면 됩니다.
사용할 데이터 구조와 풀이 방향성
적용할 알고리즘 혹은 메서드
수영
구현
- 스택
코드
function solution(board, moves) { let answer = 0 const stack = [] while (moves.length) { line = moves.shift() - 1 for (let i = 0; i < board.length; i++) { if (board[i][line]) { // 인형 뽑기 const pick = board[i][line] // 두 개 연속이면 pop if (stack.at(-1) === pick) { stack.pop() answer += 2; } else { // 연속이 아니면 push stack.push(board[i][line]) } board[i][line] = 0 break; } } } return answer; }
정은
구현
코드
function solution(board, moves) { var answer = 0; const stack = [] const moveStack = moves.reverse() //shift연산이 일어나지 않도록 맨처음 스택의 꼴로 만듦 while(moves.length) { const y = moveStack.pop()-1 for(let x=0; x<board.length; x++) { if(board[x][y]) { if (stack.length && stack[stack.length-1] === board[x][y]) { stack.pop() answer+=2 //!!터트려진 개수니까 두개를 더해줘야 함!! } else { stack.push(board[x][y]) } board[x][y] = 0 break //!!break를 해줘야 인형뽑기 크레인이 더 이상 작동하지 않음!! } } } return answer; }
종혁
구현
board
를 이용하기 편하게 가로 줄을 기준으로 [가로 줄][앞에서 몇번째] 이런식으로 구조를 변경함- Ex) [ 3, 4 ], [ 5, 2, 2 ], [ 1, 4, 5, 1 ], [ 3, 4 ], [ 1, 2, 1, 3 ]
- 0 이라는 값은 굳이 넣어줄 필요가 없어서 구조를 변경하면서 없애줌
- 선택된 줄에서 제일 마지막 원소의 값이 뽑혀져 나가고, stack 자료구조인 바구니에서 가장 마지막 원소의 값과 같으면 터트릴 수 있음
코드
function solution(board, moves) { const {length} = board const dolls = Array.from(Array(length),() => []) for(let i=length-1;i>=0;i--){//몇번째 for(let j=0;j<length;j++){//줄 if(board[i][j] === 0){continue} dolls[j].push(board[i][j]) } } console.log(dolls)//[ 3, 4 ], [ 5, 2, 2 ], [ 1, 4, 5, 1 ], [ 3, 4 ], [ 1, 2, 1, 3 ] const stack = [] let result = 0 for(const move of moves){ if(!dolls[move-1].length){continue}//인형이 하나도 없는경우 신경X const doll = dolls[move-1].pop() if(stack.at(-1) === doll){ stack.pop() result ++ }else{ stack.push(doll) } } return result * 2 }
재웅
구현
코드
function solution(board, moves) { const stack = []; let copyBoard = board.slice(); // 1. 인형들을 moves에 따라 전부 꺼냄 moves.forEach((move) => { const currentColumn = move - 1; for (let currentRow = 0; currentRow < copyBoard.length; currentRow++) { if (copyBoard[currentRow][currentColumn] !== 0) { stack.push(copyBoard[currentRow][currentColumn]); copyBoard[currentRow][currentColumn] = 0; break; } } }); return crush(stack, 0); } // 2. 꺼낸 인형들 중 붙어있는 같은 인형을 계산하고, // 둘을 제외한 후 반복 function crush(stack, count) { for (let i = 0; i < stack.length - 1; i++) { if (stack[i] == stack[i + 1]) { count += 2; stack.splice(i, 2); return crush(stack, count); } } return count; }
✏️ 후기
문제를 풀고 느낀 점, 막혔던 부분 혹은 개선 사항 등을 자유롭게 작성해주시면 됩니다.
수영
- 글이 길어서 필요한 것만 빠르게 읽는 것이 필요하다. 카카오 문제는 읽는 연습을 하기 좋은 문제인 것 같다.
- 아직 문제 읽고, 코드로 구현하는데 시간을 많이 쓰고 있다. 단계 별로 차근차근 구현해보는 연습을 할 수 있었다.
정은
- 1단계랬는데.. 문제를 코드로 풀어내는게 쉽지 않았다. 2차원 배열의 행,열에 관련해서 아직 헷갈리고 있는 것 같다
종혁
재웅