반응형
처음엔 아래 코드처럼 p[n]을 구하기 위해서 p[n-1]에 앞뒤로 1을 붙여주거나 p[n-2]에 2를 붙여주거나 p[n-3]에 3을 붙여주는 방법으로 해봤는데 시간 초과 에러가 떴다.
import sys
input = sys.stdin.readline
t = int(input())
p = [(0) for _ in range(100002)]
div = 1000000009
p[1] = [['1']]
p[2] = [['2']]
p[3] = [['1', '2'], ['2', '1'], ['3']]
for _ in range(t):
n = int(input())
if n > 3:
for num in range(4, n+1):
if p[num] != 0:
continue
ary = []
for i in range(1, 4):
plus = list(str(i))
for t in p[num-i]:
back = t+plus
front = plus+t
check = False
if front not in ary:
for idx in range(len(front)-1):
if front[idx] == front[idx+1]:
check = True
if not check:
ary.append(front)
if back not in ary:
for idx in range(len(back)-1):
if back[idx] == back[idx+1]:
check = True
if not check:
ary.append(back)
p[num] = ary
print(len(p[n]) % div)
그래서 다른 사람 방법을 참고해봤더니 아래처럼
p[idx][1]에는 끝자리가 1로 끝나는 수의 개수를 저장하고 p[idx][2]와p[idx][3]도 마찬가지로 그 숫자로 끝나는 수의 개수를 저장했다.
끝에 1을 붙일 수 있는 경우의 수는 n이 idx-1번째 값중 2,3으로 끝날때이고
2를 붙일 수 있는 경우의 수는 n이 idx-2번째 값중 1,3으로 끝날때이고
3을 붙일 수 있는 경우의 수는 n이 idx-3번째 값중 1,2로 끝날때이다.
import sys
input = sys.stdin.readline
p = [[0 for _ in range(4)] for _ in range(100001)]
div = 1000000009
p[1] = [0,1,0,0]
p[2] = [0,0,1,0]
p[3] = [0,1,1,1]
for idx in range(4,100001):
p[idx][1]=(p[idx-1][2]+p[idx-1][3])%div
p[idx][2]=(p[idx-2][1]+p[idx-2][3])%div
p[idx][3]=(p[idx-3][2]+p[idx-3][1])%div
t = int(input())
for _ in range(t):
n = int(input())
print(sum(p[n]) % div)
반응형
'Algorithm > Baekjoon' 카테고리의 다른 글
5430번 파이썬 (0) | 2022.04.01 |
---|---|
2193번 파이썬 (0) | 2022.03.31 |
11052번 파이썬 (0) | 2022.03.30 |
14503번 파이썬 (0) | 2022.03.29 |
2573번 파이썬 (0) | 2022.03.28 |