개발기록장

[알고리즘] DP유형 - 백준 9461번 파이썬 본문

TIL/알고리즘 with 파이썬

[알고리즘] DP유형 - 백준 9461번 파이썬

yangahh 2021. 1. 5. 20:29

 

 

www.acmicpc.net/problem/9461

 

9461번: 파도반 수열

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

www.acmicpc.net

 

문제

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

파도반 수열 P(N)은 나선에 있는 정삼각형의 변의 길이이다. P(1)부터 P(10)까지 첫 10개 숫자는 1, 1, 1, 2, 2, 3, 4, 5, 7, 9이다.

N이 주어졌을 때, P(N)을 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, N이 주어진다. (1 ≤ N ≤ 100)

 

출력

각 테스트 케이스마다 P(N)을 출력한다.

 

예제 입력 1

2 6 12

 

예제 출력 1

3 16

 

 

풀이

문제의 그림을 보며 P(N)값을 하나씩 구해보면서 규칙을 찾을 수 있었다.

P(1) = 1

P(2) = 1

P(3) = 1

P(4) = 2

P(5) = 2

P(6) = 3

P(7) = 4

P(8) = 5

P(9) = 7

P(10) = 9

P(11) = 12

....

 

P(N) = P(N-2) + P(N-3)     (단, N > 3이며  P(1) = 1, P(2) = 1, P(3) = 1)

이 규칙을 바로 점화식으로 이용하여 코드로 구현할 수 있다.

 

코드

# 테스트 케이스 입력받기
T = int(input())


# 테스트 케이스만큼 반복
for _ in range(T):
	
    n = int(input())
    
    # DP테이블 초기화
    p = [0] * 101

    p[1] = 1
    p[2] = 1
    p[3] = 1


	# 보텀업 방식으로 구현
    for i in range(4, n + 1):
        p[i] = p[i - 2] + p[i - 3]


    print(p[n])