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

(leetcode 문제 풀이) Pascal's Triangle

애뚱 2021. 10. 10. 13:15
반응형
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
반응형