아침에 심심해서 풀어본 문제!
빠르게 푸느라 코드는 이상할 수도 있다.
문제는 여기에서 볼 수 있다.
이 문제를 푼 과정은
먼저, board 배열이 가로 1줄을 기준으로 설정되어 있기 때문에, 생각하기 쉽게 행렬을 transpose했다. 그러면 세로로 1줄을 기준으로 하여 각각의 줄을 하나의 스택처럼 볼 수 있다. 그 후에 인형을 뽑고 뽑혀진 인형 중에 같은 인형이 있으면 +2점을 하고 그 두 인형을 없애버리는 것이다.
function solution(board, moves) {
let board2 = board2Init(board);
return pickDolls(board2, moves);
}
function board2Init(board) {
let board2 = [];
for(let i=0; i<board[0].length; i++){ board2.push([])};
for(let i=0; i<board.length; i++){
for(let j=0; j<board[i].length; j++) {
if(board[i][j] !== 0){
board2[j].push(board[i][j]);
}
}
}
return board2;
}
function pickDolls(board2, moves) {
// 정답
let answer = 0;
// 뽑아져서 대기중인 인형들
let pickedDolls = [];
// moves 배열만큼 인형 뽑기
for(let i=0; i<moves.length; i++){
// 배열은 0부터 시작, moves는 1부터 시작
let pickedColumn = moves[i]-1;
// 인형이 존재하면
if(board2[pickedColumn].length > 0){
// 인형 가져가기
let pickedDoll = board2[pickedColumn].splice(0, 1)[0];
// 인형이 이전 인형과 같은 인형인지 확인하기
if(pickedDolls.length > 0 && pickedDolls[pickedDolls.length-1] === pickedDoll) {
// 뽑혔던 인형 1개 사라짐
pickedDolls.pop();
// 맞으면 총 2개 사라짐
answer = answer + 2;
}
else {
// 틀리면 인형 쌓기
pickedDolls.push(pickedDoll);
}
}
}
return answer;
};