【競技プログラミング】「Pascal’s Triangle」with Python | LeetCode #118

Python

こちらは「Pascal’s Triangle」のPythonによる解答例となっております。この問題は、パスカルの三角形を生成する問題です。

問題

非負の整数 numRows を入力として受け取り、パスカルの三角形の最初の numRows 行を出力します。

解法

この問題は、二重ループを用いた1つのアプローチがあります。まず、numRows行のリストを用意し、各行に対して、その行の要素を計算してリストに追加します。

アルゴリズムの概要を以下に述べます。

  1. numRows行のリストを初期化します。
  2. 各行に対して、その行の要素を計算し、リストに追加します。
  3. リストを返します。

Pythonコード

以下のコードが、「Pascal’s Triangle」を解くためのPythonプログラムとなります。

### Function ##################################################################

def solve(num=0):
    
    solver  = Solution().generate
    
    if 1 <= num <= Input().input: id_LIST = [num]
    else: id_LIST = [id+1 for id in range(Input().input)]
    
    for id in id_LIST:
        data    = Input(id)
        ans     = solver(data.numRows)
        result  = "OK" if ans==data.ans else "NG"
        print(f"[{str(id).zfill(3)}] {result}")

### Class #####################################################################

class Solution(object):
    
    def generate(self, numRows):
        """
        :type numRows: int
        :rtype: List[List[int]]
        """
        
        ### row0: 1
        ### row1: 1 1
        ### row2: 1 2 1
        ### row3: 1 3 3 1
        ### row4: 1 4 6 4 1
        
        pascal = [[1]*(i+1) for i in range(numRows)]
        for i in range(numRows):
            for j in range(1,i): pascal[i][j] = pascal[i-1][j-1] + pascal[i-1][j]
        return pascal

#==============================================================================

class Input:
    
    def __init__(self, num=0):
        
        if num == 1:
            self.numRows = 5
            self.ans    =  [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
        
        elif num == 2:
            self.numRows = 1
            self.ans    = [[1]]
        
        else:
            self.input  = 2

### Main ######################################################################

if __name__ == "__main__":

    solve()

###############################################################################