LeetCode발행일 2025. 2. 22.원본 https://blog.naver.com/jword_/223769702019 ↗

Pascal's Triangle(파스칼 삼각형)

Pascal's Triangle(파스칼 삼각형) — #LeetCode #Pascaltrianlge #파스칼삼각형 #개발자의도구들 only 파이썬 목표 참고 : 여기 파스칼 삼각...

#LeetCode#Naver Blog

#LeetCode #Pascaltrianlge #파스칼삼각형 #개발자의도구들

​

​

  • only 파이썬
  • 목표 참고 : 여기

파스칼 삼각형

LeetCode(esay 110. Balanced Binary Tree)

이미지

출처: LeetCode

이렇게 만들어진 삼각형이 파스칼의 삼각형이다.

1차시도

정답

text 코드 예제
                                    💡 idea
1. 모든 row의 양쪽 끝 index는 항상 1이다.
2. 양쪽 idex를 제외하면 이전 row의 이전 idx, 같은 idx 값이 필요하다.
>>> 메모리를 사용해서 기억해주거나, parameter로 넘겨줘야한다.

3. 배열 생성 규칙
>>> row_idx = 0부터 시작하면, 각 층의 배열 크기는 row_dix + 1이다.
>>> 각 층의 배열 크기를 n이라고 하면, idx = 0, idx = n - 1은 항상 1이다.
>>> 전체 층에 대한 정보는 전역으로 관리한다.
python 코드 예제
                                    class Solution(object):
    def generate(self, numRows):
        """
        :type numRows: int
        :rtype: List[List[int]]
        """
        result = []

        def make_row(row_idx):
            row_size = row_idx + 1
            row = [1 for i in range(row_size)]

            # set init
            if row_size == 1 or row_size == 2:
                result.append(row)
                return

            for idx in range(1, row_size - 1):
                row[idx] = result[row_idx - 1][idx - 1] + result[row_idx - 1][idx]

            result.append(row)

        for i in range(numRows):
            make_row(i)
            print(result)

        return result
  • 일단 맞추긴했다.
  • 근데 뭔가 찜찜하다. .
text 코드 예제
                                    ⌛ 시간 복잡도

O(numRows ** 2) 수준

근거: 1. numsRows만큼 각 층별 row 생성
      2. row만들 때, 업데이트 수 (numRows - 1 - 2)

줄일 수 없을까?

세가지 방안이 있다고 한다.

​

text 코드 예제
                                    1. Using Recursion
-- 5 -> 4 -> 3 -> 2 -> 1 순으로 recursive

2. Using Combinatorial Formula
->
3. Using Dynamic Programming with 1D Array
>>> 이거 내가 했던거랑 빗스
>>> 근데 이것도 recursive랑 비슷함
python 코드 예제
                                    class Solution:
    def generate(self, numRows):
        result = [1]

        if numRows == 1:
            return result

        prev = self.generate(numRows - 1)

        for i in range(1, numRows - 1):
            result.append(prev[i - 1] + prev[i])

        result.append(1)
        return result
  • 음.. 일단 recursive로 원하는 row 배열을 구하는것은 완료
  • 문제는 전체 배열을 어떻게 관리해야할지가 관건이다.

​

❌🙅🙅🙅🙅❌

python 코드 예제
                                    class Solution:
    def __init__(self):
        self.results = []
    def generate(self, numRows):
        result = [1]

        if numRows == 1:
            self.results.append(result)
            return result

        prev = self.generate(numRows - 1)

        for i in range(1, numRows - 1):
            result.append(prev[i - 1] + prev[i])

        result.append(1)
        self.results.append(result)

        return self.results
  • result를 이런식으로 관리하는건 의미가 없다. generate에서 return으로 self.resultf를 return하기 때문에 이상한 값이 나온다.

​

🤔 generate는 항상 자기 자신만을 return 하는데 전체 결과를 어떻게 가져와야 하는가?

>> 아무리 생각해봐도 dp를 함께 사용해야할 것 같다. ❌

​

✅ 🙆🙆‍♂️🙆‍♀️🆗 ✅

python 코드 예제
                                    class Solution:
    def generate(self, numRows):
        row = [1 for i in range(numRows)]

        if numRows == 1:
            return [[1]]

        prev = self.generate(numRows - 1)
        for i in range(1, numRows - 1):
            row[i] = prev[-1][i - 1] + prev[-1][i]

        prev.append(row)
        return prev
  • 초기값을 \[\[1\]\]로 셋팅해준다
  • 이후 prev = \[\[\]\] 형태가 되고, prev\[-1\]은 항상 이전 층의 row가 된다.
  • 마지막에 현재 row를 prev에 붙여서 내보낸다!

python detail 잡아가기

앞으로 이 코너는 꼭 넣자... ptrhon이 여전히 미흡하다.

python 코드 예제
                                    1. 배열을 모두 1로 초기화하기

🙅 arr = [1 * wanted_size] = [wanted_size]가 된다.

✅ arr = [1 for i in range(wnated_size)] = [1, 1, 1 ,1 ...]

2. range 범위
🙅 for i range(1, 1):
 i = 1통과한다. -> 틀렸다.

✅ i = 1을 거치지 못함

후기

이런 쉬운 문제에도 충분히 배울 수 있는 부분은 많다!!