
😎풀이
- 이웃의 수를 계산하는
countLivedNeighbor
함수를 작성한다.
board
를 순회한다.
2-1. 만약, 살아있는 세포를 가진 셀의 살아있는 주변 세포 수가 2 미만이거나, 3을 초과할 경우 해당 세포는 죽는다. (동시 처리되야 하므로 임시 -1)
2-2. 만약, 죽어있는 세포를 가진 셀의 살아있는 주변 세포 수가 정확히 3이라면, 해당 세포는 살아난다. (동시 처리되야 하므로 임시 2)
board
를 재순회한다.
3-1. 살아있다가 죽은 -1로 표시된 셀의 세포를 죽은 상태로 변경한다.
3-2. 죽어있다가 살아난 2로 표시된 셀의 세포를 살아있는 상태로 변경한다.
function gameOfLife(board: number[][]): void {
const rowMax = board.length
const colMax = board[0].length
const direction = [
[-1, -1], [-1, 0], [-1, 1],
[0, -1], [0, 1],
[1, -1], [1, 0], [1, 1]
]
function countLivedNeighbor(row: number, col: number) {
let count = 0
for(const [dy, dx] of direction) {
const ny = row + dy
const nx = col + dx
if(ny < 0) continue
if(ny >= rowMax) continue
if(nx < 0) continue
if(nx >= colMax) continue
if(Math.abs(board[ny][nx]) === 1) count++
}
return count
}
for(let row = 0; row < rowMax; row++) {
for(let col = 0; col < colMax; col++) {
const neighbors = countLivedNeighbor(row, col)
if(board[row][col] === 1) {
if(neighbors < 2 || neighbors > 3) board[row][col] = -1
} else {
if(neighbors === 3) board[row][col] = 2
}
}
}
for(let row = 0; row < rowMax; row++) {
for(let col = 0; col < colMax; col++) {
if(board[row][col] === -1) board[row][col] = 0
else if(board[row][col] === 2) board[row][col] = 1
}
}
};