알고리즘 공부/백준

백준 9461번: 파도반 수열 (파이썬)

뚜써 2023. 5. 11. 23:58

https://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)을 출력한다.

 

풀이

 

문제를 읽고 DP로 해결해야 하는 문제라고 생각했다. 또한 그림을 잘 보기만 해도 해결할 수 있는 문제다.

가장 가운데 크기가 1, 2인 삼각형 5개를 제외하고, 이후 삼각형부터는 이전의 삼각형들 중 2개의 삼각형과 변이 맞닿아 있는 것을 확인할 수 있다. 그리고 이 삼각형들이 몇 번째 이전의 삼각형인지 확인을 해보면, i번째 삼각형과 맞닿아 있는 삼각형은 i-1, i-5번째 삼각형이다(단, i >= 6).

 

소스 코드

import sys

t = int(sys.stdin.readline())

p = [1, 1, 1, 2, 2]
for i in range(5, 101):
  p.append(p[i-5]+p[i-1])
for _ in range(t):
  n = int(sys.stdin.readline())
  print(p[n-1])