출처 : 제주코딩베이스켐프 JAVASCRIPT 알고리즘 100제 - 100번
const puzzles = [
[0,0,0,0],
[0,1,0,3],
[2,5,0,1],
[2,4,4,1],
[5,1,1,1]
]
const controls = [1,1,1,1,3,3,3];
const length = controls.length;
const stack = [];
let score = 0;
for(let i = 0; i < length; i++) {
const control = controls[i];
const rowArr = [];
puzzles.forEach((row, rowIndex) => {
row.forEach((col, colIndex) => {
if(colIndex === control - 1) {
if(col) {
rowArr.push(rowIndex)
}
}
})
})
if(rowArr.length > 0) {
const ball = puzzles[rowArr[0]][control - 1];
if(ball) {
if(stack[stack.length - 1] === ball) {
stack.push(ball);
stack.splice(stack.length - 2, 2)
console.log(`${ball * 2}점 획득!`)
score = score + (ball * 2);
} else {
stack.push(ball);
}
puzzles[rowArr[0]].splice(control - 1, 1, 0)
}
} else {
console.log(`1점 마이너스!`)
score = score - 1;
}
}
console.log(stack, score)
조작하는 값 (controls[0]
or contols.shift()
) 과 퍼즐의 칸(col
)의 index
값과 같고, 그 칸에 있는 값이 0
이 아니면 점수 칸stack
에 넣어준다.
주의해야할 점은, 퍼즐을 2중배열을 돌릴 때, contorls.shift() === col
일 때, 그 col 값
을 stack에 넣고 col 값을 0으로 바꿔주면 그 관련 colIndex 모두가 0으로 바뀌고 stack에 넣어진다. 이걸 방지해야할 필요가 있다.
그래서 사용한 방법은 퍼즐에서 control의 인덱스와 관련된 값중에서 가장 낮은 rowIndex를 갖고 있는것을 갖고와서 그것을 이용하는 것이다.