Stay Hungry Stay Foolish

SWEA

[SWEA] 2005. 파스칼의 삼각형 (Python/D2)

dev스카이 2024. 11. 10. 18:51

[문제 링크] 👇

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


풀이 방법

💡 규칙을 보자

 

맨 처음과 맨 끝은 항상 1이다.

가운데 숫자는 인덱스와 일치한데, 그 수의 개수는 인덱스 - 1 과 일치하다.

이 규칙을 참고해서 리스트에 append() 하고 출력한다.

Solution

T = int(input())  # 테스트 케이스 수
for test_case in range(1, T + 1):
    N = int(input())
    print(f"#{test_case}")
    print(1)
    for i in range(1, N):
        pascal = [0]
        pascal[0] = 1
        for j in range(i - 1):
            pascal.append(i)
        pascal.append(1)
        print(*pascal)

 

 

개선할 점

코드를 개선해 파스칼의 삼각형을 더 효율적으로 생성할 수 있다. 현재 코드는 삼각형의 각 줄을 수동으로 초기화하려 하므로, 각 숫자의 값을 정확히 계산하지 못할 수 있다. 아래의 접근 방법은 파스칼의 삼각형의 각 행을 이전 행의 값을 활용해 효율적으로 생성한다.

 

  • 삼각형 데이터 구조 사용 : 각 줄을 triangle에 저장해 반복문을 통해 필요한 값에 접근
  • 이전 줄 값 참조 : 현재 줄의 요소들은 이전 줄의 값을 이용하여 생성되므로 매번 새로 계산하지 않는다.
  • 깔끔한 출력 : *row로 각 행을 간결하게 출력하여 결과가 보기 쉽게 나온다.

 

 

개선된 코드

T = int(input())  # 테스트 케이스 수

for test_case in range(1, T + 1):
    N = int(input())
    print(f"#{test_case}")
    
    # 파스칼의 삼각형 초기화
    triangle = [[1]]  # 첫 번째 줄은 항상 [1]
    
    for i in range(1, N):
        row = [1]  # 각 줄의 첫 번째 요소는 항상 1
        
        # 이전 줄을 참조하여 현재 줄의 값을 계산
        for j in range(1, i):
            row.append(triangle[i-1][j-1] + triangle[i-1][j])
        
        row.append(1)  # 각 줄의 마지막 요소는 항상 1
        triangle.append(row)  # 삼각형에 현재 줄 추가
    
    # 출력
    for row in triangle:
        print(*row)

👩‍💻 회고

쉽게 생각하면 풀리는 문제였다. 원래 내 풀이와 개선된 코드를 비교해보면 실행 시간에서 차이가 난다. 이 문제를 풀면서 내가 봐도 약간 불필요하게 초기화를 하고 있다거나, 반복문을 돌릴 때마다 출력을 하고 있어서 효율적으로 좋은 코드는 아닐거라 생각은 했다.