본문 바로가기

Algorithm

[LeetCode] Python - 289. Game of Life

https://leetcode.com/problems/game-of-life/

 

Game of Life - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

생각

 

주어진 4개의 규칙을 차근차근 적용시키면 되는 문제입니다.

 

1. 살아있는 세포에 살아있는 이웃이 2개 미만 : 죽는다

2. 살아있는 세포에 살아 있는 이웃 2,3개 : 다음세대에 살아있다
3. 살아있는 세포에 살아있는 이웃 > 3 : 죽는다
4. 죽어있는 세포에 살아 있는 이웃이 3개면 : 다음 세대에 살아있다 

 

살아나는 상태, 죽는 상태가 모두 동시에 일어나므로 2차원 배열을 deepcopy 하고, 기존의 배열의 값을 변경시켰습니다. 처음에는 원래 문제를 풀던 습관대로 새로운 배열의 값을 변경시켰는데 항상 문제를 꼼꼼히 읽어야겠습니다!

 

 

Python Code

import copy
class Solution:
    def gameOfLife(self, board: List[List[int]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        # 1. 살아있는 세포에 살아있는 이웃이 2개 미만 : 죽는다
        # 2. 살아있는 세포에 살아 있는 이웃 2,3개 : 다음세대에 살아있다
        # 3. 살아있는 세포에 살아있는 이웃 > 3 : 죽는다
        # 4. 죽어있는 세포에 살아 있는 이웃이 3개면 : 다음 세대에 살아있다 
        
        # 동시에 적용!!!
        copyBoard = copy.deepcopy(board)
        R,C = len(board), len(board[0])
        dy = [-1,-1,-1,0,1,1,1,0]
        dx = [-1,0,1,1,1,0,-1,-1]
        
        for i in range(R):
            for j in range(C):
                now = copyBoard[i][j]
                live,die = 0,0
                
                for d in range(8):
                    ny = i + dy[d]
                    nx = j + dx[d]
                    if ny >= R or ny < 0 or nx >= C or nx < 0:
                        continue
                    neighbor = copyBoard[ny][nx]
                    if neighbor == 1 :
                        live+=1
                    else:
                        die+=1
                
                if now == 1:
                    if live < 2:
                        board[i][j] = 0  
                        
                    elif live == 2 or live == 3:
                        continue
                        
                    elif live > 3:
                        board[i][j] = 0
                    
                else:
                    if live == 3:
                        board[i][j] = 1
                        
                
        return board