SWEA_2007 패턴 마디의 길이(파이썬)

2024. 8. 24. 23:22알고리즘 풀이

문제링크
리스트 컴프리헨션 문법
크기가 N인 파스칼의 삼각형을 만들어야 한다.

파스칼의 삼각형이란 아래와 같은 규칙을 따른다.

  1. 첫 번째 줄은 항상 숫자 1이다.
  2. 두 번째 줄부터 각 숫자들은 자신의 왼쪽과 오른쪽 위의 숫자의 합으로 구성된다.

N이 4일 경우,


N을 입력 받아 크기 N인 파스칼의 삼각형을 출력하는 프로그램을 작성하시오.

[제약 사항]

파스칼의 삼각형의 크기 N은 1 이상 10 이하의 정수이다. (1 ≤ N ≤ 10)

[입력]

가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.

각 테스트 케이스에는 N이 주어진다.

[출력]

각 줄은 '#t'로 시작하고, 다음 줄부터 파스칼의 삼각형을 출력한다.

삼각형 각 줄의 처음 숫자가 나오기 전까지의 빈 칸은 생략하고 숫자들 사이에는 한 칸의 빈칸을 출력한다.

(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)


입력
1
4


출력
#1
1
1 1
1 2 1
1 3 3 1


생각

삼각형을 만들 리스트를 N+1만큼 만든다 왜 N+1 만큼이냐면 인덱스가 0부터 시작이니까 코드짜기 편하게 그냥 1개 더 만든거다.
만약 "나는 N만큼만 만들어에요! " 라면 아래 보이는 코드에 i에다 +1을 해야한다.

다시 본론으로

삼각형의 규칙을 쭉~ 살펴보니까 처음이랑 을 제외하고는 값이 어떻게 생기는 거냐면
현재 내 위치의 값 = 전 리스트의 내위치의 값 + 전 리스트의 내위치-1의 값 이러면 값이 나온다

3번째 줄에 2번째 숫자 2는 방금 설명한 공식으로 나온 값이다
4번째 줄에 2번째 숫자 3도 마찬가지다. 직접 노트에 그려보면 바로 알 수 있다.

코드

for _ in range(int(input())):
    n = int(input())
    triangle = [[] for _ in range(n + 1)]       # 삼각형을 담을 리스트

    for i in range(1, n + 1):
        if i == 1:                              # 첫번째는 그냥 1 만 넣음
            triangle[1].append(1)   
        elif i == 2:                            # 두번째는 1을 두개 넣음 
            triangle[2].append(1)
            triangle[2].append(1)
        else:                                   # 이후로는 
            for j in range(i):                  # i만큼 즉, 몇번째 줄인가 만큼 반복해서 값을 채울거다.
                if j == 0 or j == i - 1:        # 처음과 끝은 항상 1이다.
                    triangle[i].append(1)
                else:                           # 처음과 끝이 아니면! 

                    # 현재 내 위치의 값 = 전 리스트의 내위치 + 전 리스트의 내위치-1 
                    val = triangle[i - 1][j] + triangle[i - 1][j - 1]
                    triangle[i].append(val)

    # 답 출력 형식.. [[], [1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]]
    # 0번째 빼고 1부터 마지막까지 한줄에 한 리스트씩 출력
    print(f"#{_+1}")
    for idx in range(1, n + 1): 
        print(*triangle[idx])               # 리스트에 * 이런 별표를 붙이면 리스트가 풀려서 출력된다. 즉, [1,2] => 1,2 요러케

다른 풀이

# 더 깔끔한 풀이
for case in range(int(input())):
    n = int(input())
    triangle = [[0] * (n + 1) for _ in range(n + 1)]
    triangle[1][1] = 1
    for y in range(2, n + 1):
        for x in range(1, y + 1):
            triangle[y][x] = triangle[y - 1][x - 1] + triangle[y - 1][x]

    print(f"#{case+1}")
    for i in range(1, n + 1):
        for j in range(1, i + 1):
            print(arr[i][j], end=" ")
        print()
        

이 풀이는 1번째보다 보기 편안하다..
값을 도출하는 접근법은 같다.

차이점
1. 첫번째 1을 먼저 넣은 것
2. triangle의 리스트를 0으로 채워서 미리 만들어둔 것 이러면
현재 내 위치의 값 = 전 리스트의 내위치의 값 + 전 리스트의 내위치-1의 값
이식을 2번째 삼각형부터 적용해도 index out of range 에러가 안나오겠죠??
아주 대단한 풀이입니다.
더 발전해야겠어요...

문제는 많이 풀수록 실력이 좋아진다고하니까 많이 풀자요🙂

오늘의 수다
저번에 면접을 봤는데 면접을 보면서 알았어요
저는 떨어진다는 것을
그래서 그냥 궁금한거 아무거나 물어보자라는 생각으로
취준 시점에서 어떤 학습 혹은 프로젝트를 해야 좋게 보이는지 물었던 것 같아요.

너무 뻔한 말이지만 고민한 흔적을 기록하는 것이었죠
알고있지만 왜 안했나 싶어요 ㅎㅎ
여러분도 블로그 시작하시져!

그리고 개발자로 빠르게 성장하는 팁을 알려주셨는데
바로 스트레스!

스트레스를 받으면 받은 만큼 실력이 오른데요.
정말 아찔하죠?

그래서 요즘은 저에게 어렵거나 복잡한 문제를 풀면
정말 무덤덤하게 문제를 대하는 연습?이랄까 하고 있습니다.ㅎㅎ

하루하루 무덤덤하게 해야 할 학습을 꾸준히 해봅시다!

'알고리즘 풀이' 카테고리의 다른 글

2001_파리퇴치  (1) 2024.08.24
1983_조교의 성적 매기기  (2) 2024.08.24
SWEA_1953_달팽이숫자  (3) 2024.08.24
SWEA_2007 패턴 마디의 길이(파이썬)  (2) 2024.08.24
3304_최장 공통 부분 수열  (2) 2024.08.24