https://www.acmicpc.net/problem/9461
문제
오른쪽 그림과 같이 삼각형이 나선 모양으로 놓여져 있다. 첫 삼각형은 정삼각형으로 변의 길이는 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])
'알고리즘 공부 > 백준' 카테고리의 다른 글
백준 11727번: 2×n 타일링 2 (파이썬) (0) | 2023.05.13 |
---|---|
백준 2156번: 포도주 시식 (파이썬) (0) | 2023.05.12 |
백준 1912번: 연속합 (파이썬) (0) | 2023.05.11 |
백준 1932번: 정수 삼각형 (파이썬) (0) | 2023.05.11 |
백준 11053번: 가장 긴 증가하는 부분 수열 (파이썬) (0) | 2023.05.11 |