Leetcode
[Leetcode] 289. Game of Life - JS
Wix
2024. 10. 14. 16:00
1. 문제 분석
문제분석
--------------------
- 초기값 cell에 live면 1, dead면 0으로 나타난 m x n 구조
- 각 cell은 8명의 이웃과 아래 4개의 규칙에 따라 상호작용한다.
조건 1. 이웃한 cell 중 live가 2개 미만일 때, 자기 자신이 live면 죽는다.
조건 2. 이웃한 cell 중 live가 2 ~ 3개일 때, 자기 자신이 live면 유지된다.
조건 3. 이웃한 cell 중 live가 3개 초과이고, 자기 자신이 live면 죽는다.
조건 4. 이웃한 cell 중 정확히 3개 live가 존재하고 자기 자신이 dead면 산다.
- 탄생과 죽음은 동시에 일어나야한다.
즉, cell이 변경된 다음 상태값을 참조하여 다른 cell이 영향을 받으면 안된다.
- 현재 board 상태가 주어질 때, 위 조건을 적용하여 제자리에서 변경하라.
제한조건
--------------------
- m == board.length
- n == board[i].length
- 1 <= m, n <= 25
- board[i][j]는 0 또는 1이다.
2. 접근 방법
접근방법
--------------------
이웃한 cell을 판단한다. 이웃한 cell은 [i-1 ~ i+1], [j-1 ~ j+1]
현재 상태를 기반으로 룰에 맞도록 미래 상태로 바꿔야 하므로 단순히 live, dead 만으로 판단하기 어렵다.
그러므로 아래와 같이 현재와 미래의 상태값이 다른 경우를 추가한다.
0: 현재 dead, 미래 dead
1: 현재 live, 미래 live
2: 현재 live, 미래 dead
3: 현재 dead, 미래 live
이웃 cell을 확인하여 1번 or 2번이면 즉, 현재 살아있는 cell 갯수를 카운트 한다. (neighbors)
neighbors 조건에 따라 board[i][j]의 상태값을 변경한다.
마지막에 board를 순회하면서 2,3번인 요소를 조건에 맞게 0, 1로 바꿔준다.
3. 코드
var gameOfLife = function(board) {
const rows = board.length;
const cols = board[0].length;
const directions = [
[-1,-1], [-1, 0], [-1, 1],
[0, -1], [0, 1],
[1, -1], [1, 0], [1, 1]
]
for (let i = 0; i < rows; i++) {
for (let j = 0; j < cols; j++) {
let neighbors = 0;
// 이전 상태에서 살아있는 이웃의 갯수
for (let [dx, dy] of directions) {
const newRow = i + dx;
const newCol = j + dy;
if (newRow >= 0 && newRow < rows && newCol >= 0 && newCol < cols) {
if (board[newRow][newCol] === 1 || board[newRow][newCol] === 2) {
neighbors++;
}
}
}
// 조건 1과 조건 3
if (board[i][j] === 1 && (neighbors < 2 || neighbors > 3)) {
board[i][j] = 2
} else if (board[i][j] === 0 && neighbors === 3) {
board[i][j] = 3
}
}
}
for (let i = 0; i < rows; i++) {
for (let j = 0; j < cols; j++) {
if (board[i][j] === 2) {
board[i][j] = 0
} else if (board[i][j] === 3) {
board[i][j] = 1
}
}
}
};
4. 복잡도 분석
- 시간복잡도: O(n^2)
- 공간복잡도: O(1)
GPT에게 물어봐서 문제 풀이를 공부했다.
문제에서 주어진 0(dead), 1(live) 두 가지 상태값으로 풀기 어려우니 현재와 미래의 상태값이 다른 2(live -> dead), 3(dead -> live) 값도 추가하는 방법이 신박했다.