b의 요소들(y)을 loop로 받아온다.
y를 a의 인덱스로 적용하기위해 x = y-1로 정한다.
c[x]가 0이상이면 a[c[x]][x]또한 0이상이므로 이 수(a[c[x]][x])를 stack에 넣어준다.
만약 stack의 마지막이 num과 같다면 answer에 2를 더해주고 stack의 마지막은 제거한다.
c[x]는 +1해준다. 만약 c[x]가 5가되면 -1로 바꿔준다.
c[x]가 0이면 loop를 통해 a[i][x]가 0이 아닌 부분을 찾는다.
만약 a[i][x]가 0이 아니라면 a[i][x]를 stack에 넣어준다.
c[x] = i+1로 설정하며 c[x] = 5일 경우에는 -1로 바꿔준다.
c[x]가 -1로 되어버리면 상위 두개의 조건식에 부합되지않아 제외된다.
//input
let a = [
[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],
];
let b = [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5];
//--------------------------------------------------
let c = [0, 0, 0, 0, 0];
let answer = 0;
let stack = [];
for (let y of b) {
let x = y - 1;
if (c[x] > 0) {
if (stack.length > 0 && stack[stack.length - 1] === a[c[x]][x]) {
stack.pop();
answer += 2;
c[x]++;
if (c[x] === 5) c[x] = -1;
} else {
stack.push(a[c[x]][x]);
c[x] += 1;
if (c[x] === 5) c[x] = -1;
}
} else if (c[x] === 0) {
for (let i = 0; i < 5; i++) {
if (a[i][x] !== 0) {
if (stack.length > 0 && stack[stack.length - 1] === a[i][x]) {
stack.pop();
answer += 2;
c[x] = i + 1;
if (c[x] === 5) c[x] = -1;
} else {
stack.push(a[i][x]);
c[x] = i + 1;
if (c[x] === 5) c[x] = -1;
}
break;
}
}
}
}
console.log(answer);
c[x]++;
if (c[x] === 5) c[x] = -1;
c[x] = i + 1;
if (c[x] === 5) c[x] = -1;
위 두 부분의 중복을 제거해준다.
//input
let a = [
[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],
];
let b = [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5];
let c = [0, 0, 0, 0, 0];
let answer = 0;
let stack = [];
for (let y of b) {
let x = y - 1;
if (c[x] > 0) {
if (stack.length > 0 && stack[stack.length - 1] === a[c[x]][x]) {
stack.pop();
answer += 2;
} else stack.push(a[c[x]][x]);
c[x]++;
if (c[x] === 5) c[x] = -1;
} else if (c[x] === 0) {
for (let i = 0; i < 5; i++) {
if (a[i][x] !== 0) {
if (stack.length > 0 && stack[stack.length - 1] === a[i][x]) {
stack.pop();
answer += 2;
} else stack.push(a[i][x]);
c[x] = i + 1;
if (c[x] === 5) c[x] = -1;
break;
}
}
}
}
console.log(answer);
//loop로 moves의 요소(mov)들을 받아온다.
// loop로 board[i][mov-1]에서 i를 돌려보며 0이 아닐때를 찾는다.
// board[i][mov-1]를 stack에 넣어주고 0으로 바꿔준다.
// 만약 stack의 마지막 요소가 board[i][mov-1]와 같다면 stack의 마지막요소를 제거해주고 answer+=2를 해준다.
//input
let board = [
[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],
];
let moves = [1, 5, 3, 5, 1, 2, 1, 4];
let answer = 0;
let stack = [];
for (let mov of moves) {
for (let i = 0; i < board.length; i++) {
if (board[i][mov - 1] !== 0) {
if (stack[stack.length - 1] === board[i][mov - 1]) {
answer += 2;
stack.pop();
} else {
stack.push(board[i][mov - 1]);
}
board[i][mov - 1] = 0;
break;
}
}
}
console.log(answer);
이 코드 또한 O(n^2)이므로 결국 시간복잡도 측면에서는 이전의 코드와 같다.
그러나 가독성이 훨씬 좋다.