[백준] 9461번 - 파도반 수열 | 파이썬

SangJin Ham·2023년 7월 12일
0

백준

목록 보기
33/51
post-thumbnail

9461번 - 파도반 수열

시간제한 : 1초
메모리 제한 : 128MB


문제

아래 그림과 같이 삼각형이 나선 모양으로 놓여져 있다. 첫 삼각형은 정삼각형으로 변의 길이는 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

코드

import sys

T = int(sys.stdin.readline().strip())

# 파도반 수열 P(N)을 구하기 전에 필요한 숫자
nums = [1, 1, 1]

# N <= 100이므로 P(100)까지 정의
# P(1) -> P(0)으로 생각
# 따라서 P(0) ~ P(99)
# for문의 시작 지점을 정하면 끝지점은 실행 안 하므로 +1하여 100으로 설정
for i in range(3, 100):
    nums.append(nums[i-2] + nums[i-3])

# N에 맞게 출력
for _ in range(T):
    N = int(sys.stdin.readline().strip())

    print(nums[N-1])

풀이

시간 : 48ms
메모리 : 31256KB

먼저 이 문제는 DP(다이나믹 프로그래밍)을 이용해 어떤 규칙으로 수열이 나타나는지 정의해놓고 풀면 된다.

내가 찾은 규칙은 아래와 같다
P(N) = P(N-2) + P(N-3)

따라서 위 식을 적용해 P(1) ~ P(100)까지 미리 정의해 N을 입력받으면 P(N)을 출력해주면 된다.

profile
끄적끄적

0개의 댓글