본문 바로가기
Algorithm

[동적계획법/DP] 백준 9461 파도반 수열 - Python

by jangThang 2022. 2. 26.
반응형

백준 온라인 저지

 

[ Contents ]

     

     

    1. 문제 (링크 참조)

     

    9461번: 파도반 수열

    오른쪽 그림과 같이 삼각형이 나선 모양으로 놓여져 있다. 첫 삼각형은 정삼각형으로 변의 길이는 1이다. 그 다음에는 다음과 같은 과정으로 정삼각형을 계속 추가한다. 나선에서 가장 긴 변의

    www.acmicpc.net

     

     

     

    2. 문제 풀이

     정삼각형이 나선을 그리며 변의 길이가 늘어납니다. 늘어나는 변의 길이를 '파도반 수열'이라고 할 때, N번째 수를 구해야 합니다.

     

    1 2 3 4 5 6 7 8 9 10
    1 1 1 2 2 3 4 5 7 9

     문제에서 주어진 P(1) ~ P(10)을 보면 규칙이 보이지 않지만, 좀 더 나열하면 보입니다.

     P(6) 이후로 P(i-1) + P(i-5)의 규칙이 나타납니다.

     

    11 12 13 14 15 16 17 18 19 20
    3+9 4+11 5+15 7+20 9+27 12+36 15+48 ...    

     

     

    2022.02.12 - [Algorithm] - [Algorithm] 메모해두고 불러와서 사용하는 동적 프로그래밍(DP)

     

    [Algorithm] 메모해두고 불러와서 사용하는 동적 프로그래밍(DP)

    [ Contents ] 1. 동적 프로그래밍(Dynamic Programming, 동적계획법) 동적계획법(Dynamic programming, DP): 작은 문제들에 대한 결과를 배열(리스트)에 저장하고, 이를 이용해서 입력 크기가 더 큰 문제를 점진..

    star7sss.tistory.com

     피보나치 수열과 마찬가지로, DP로 구현해줍니다.

     

     

     

    3. 코드

    import sys
    input = sys.stdin.readline
    
    T = int(input())
    cache = [1, 1, 1, 2, 2, 3] #파도반 수열
    
    def sail(n):
        #n이 cache에 없을 경우, n까지 수열 구함
        while n > len(cache)-1:
            cache.append(cache[len(cache)-5]+cache[len(cache)-1])
    
        #n이 cache에 있을 경우
        return cache[n-1]
    
    for _ in range(T):
        N = int(input())
        print(sail(N))

     테스트 케이스 T번 반복해서 파도반 수열을 구합니다. 매번 다시 구하지 않고, cache에 저장해두고 불러와서 사용합니다. 이전 테스트케이스에서 구한 n보다 작으면 예전에 구해둔 걸 출력하고, n이 더 크면 추가해서 구합니다.

     물론, 최악의 경우를 고려해서 N을 100까지 구해놓고 푸셔도 무관합니다.

     

    star가 되고나서 Tistory

    반응형

    댓글