문제
그림과 같이 삼각형이 나선 모양으로 놓여져 있다. 첫 삼각형은 정삼각형으로 변의 길이는 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)
내 코드
padovan = []
def findP(n):
for i in range(n):
if (i < 3):
padovan.append(1)
elif (i < 5):
padovan.append(2)
else:
padovan.append(padovan[i-1] + padovan[i-5])
case = input()
cases = []
for i in range(int(case)):
cases.append(int(input()))
findP(max(cases) + 1)
for i in cases:
print(padovan[i - 1])
과정
삼각형을 직접 그려보며 수열의 규칙을 찾아본 결과, N=6일 때, 즉 도형의 발전 방향이 나선 방향으로만 이어질 때 부터는 수열이 규칙적이라는 것을 발견했다. N < 6일 때는 삼각형들끼리 남는 변을 커버하면서 계산하기 어렵게 그려지지만 그 이후부터는 삼각형이 하나 추가될 때마다 도형의 제일 긴 변이 갱신되기 때문이다.
N = 5일 때까지 오각형이 그려진 후 규칙이 생기기 때문에 P(N)은 P(N-1)과 P(N-5)의 합이다. 오각형을 두르며 삼각형이 그려지는 모습을 상상해 보면 쉽게 예측 가능한 식이다.
재귀함수로 문제를 풀어볼까 했지만 입력 값을 여러 개 받기도 하고 분명히 타임아웃이 뜰 것이기 때문에 전역 리스트를 생성해 중복돤 계산을 줄이는 방법을 택했다. 사용자가 입력한 값들 중 가장 큰 수까지의 파도반 수열을 계산해 저장하고 출력했다.
...
쉽게 풀리지 않을 것 같아 재밌어 보여서 도전했는데 생각보다 너무 간단해서 약간 김빠졌다.
'Algorithm' 카테고리의 다른 글
[1018] 체스판 다시 칠하기 - Python (0) | 2022.01.26 |
---|---|
[1004] 어린 왕자 - Python (0) | 2022.01.24 |
[11729] 하노이 탑 - Python (2) | 2022.01.23 |
[1065] 한수 - Python (0) | 2022.01.21 |
[4673] 셀프 넘버 - Python (1) | 2022.01.20 |