😎풀이

  1. 이웃의 수를 계산하는 countLivedNeighbor 함수를 작성한다.
  2. board를 순회한다.
    2-1. 만약, 살아있는 세포를 가진 셀의 살아있는 주변 세포 수가 2 미만이거나, 3을 초과할 경우 해당 세포는 죽는다. (동시 처리되야 하므로 임시 -1)
    2-2. 만약, 죽어있는 세포를 가진 셀의 살아있는 주변 세포 수가 정확히 3이라면, 해당 세포는 살아난다. (동시 처리되야 하므로 임시 2)
  3. 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
        }
    }
};

profile
내 지식을 공유할 수 있는 대담함

0개의 댓글