본문 바로가기

문돌이 존버/프로그래밍 스터디

(leetcode 문제 풀이) Pascal's Triangle

반응형
Given an integer numRows, return the first numRows of Pascal's triangle.
In Pascal's triangle, each number is the sum of the two numbers directly above it as shown:

Example 1:
Input: numRows = 5 Output: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
Example 2:
Input: numRows = 1 Output: [[1]]
 
Constraints:
1 <= numRows <= 30

# runtime: 56ms
class Solution:
    def generateHelp(self, n: int, prev_level: List[int]) -> List[int]:
        if n <= 1: # 0층과 1층일 경우
            return [1] * (n + 1)
        
        new_level = [1] # 첫 번째 원소
        for i in range(1, n):
            new_level.append(prev_level[i - 1] + prev_level[i])
        new_level.append(1) # 마지막 원소 
        return new_level
    
    def generate(self, numRows: int) -> List[List[int]]:
        res_levels = [] # answer
        prev_res = [] # 이전 층
        
        for i in range(numRows):
            tmp_res = self.generateHelp(i, prev_res) # 새로운 층
            res_levels.append(tmp_res)
            prev_res = tmp_res
        
        return res_levels
# runtime: 36ms
class Solution:
    def generate(self, numRows: int) -> List[List[int]]:
        res = [[1] * i for i in range(1, numRows + 1)]

        for r in range(2, len(res)):
            for c in range(1, len(res[r]) - 1):
                res[r][c] = res[r - 1][c - 1] + res[r - 1][c]
                
        return res

위의 두 코드 모두 동일한 로직이지만 첫 번째 코드의 runtime이 더 긴 이유는 new_level과 res_levels에 계속해서 append() 를 실행하기 때문이 아닐까 싶다. 두 코드 모두 for문을 통해 다음 층 값은 이전 층 값의 합으로 이루어짐을 완성시켰다. 파스칼의 삼각형대로 모든 층의 첫 번째 그리고 마지막 원소가 1임에만 유의하면 된다.

728x90
반응형