본문 바로가기

알고리즘(algorithm)/백준

백준 1904 01타일 python

 

1904번: 01타일

지원이에게 2진 수열을 가르쳐 주기 위해, 지원이 아버지는 그에게 타일들을 선물해주셨다. 그리고 이 각각의 타일들은 0 또는 1이 쓰여 있는 낱장의 타일들이다. 어느 날 짓궂은 동주가 지원이

www.acmicpc.net

문제

지원이에게 2진 수열을 가르쳐 주기 위해, 지원이 아버지는 그에게 타일들을 선물해주셨다. 그리고 이 각각의 타일들은 0 또는 1이 쓰여 있는 낱장의 타일들이다.

 

어느 날 짓궂은 동주가 지원이의 공부를 방해하기 위해 0이 쓰여진 낱장의 타일들을 붙여서 한 쌍으로 이루어진 00 타일들을 만들었다. 결국 현재 1 하나만으로 이루어진 타일 또는 0타일을 두 개 붙인 한 쌍의 00타일들만이 남게 되었다.

 

그러므로 지원이는 타일로 더 이상 크기가 N인 모든 2진 수열을 만들 수 없게 되었다. 예를 들어, N=1일 때 1만 만들 수 있고, N=2일 때는 00, 11을 만들 수 있다. (01, 10은 만들 수 없게 되었다.) 또한 N=4일 때는 0011, 0000, 1001, 1100, 1111 등 총 5개의 2진 수열을 만들 수 있다.

 

우리의 목표는 N이 주어졌을 때 지원이가 만들 수 있는 모든 가짓수를 세는 것이다. 단 타일들은 무한히 많은 것으로 가정하자.

입력

첫 번째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 1,000,000)

출력

첫 번째 줄에 지원이가 만들 수 있는 길이가 N인 모든 2진 수열의 개수를 15746으로 나눈 나머지를 출력한다.

풀이

# 타일이 하나일 경우 1
# 타일이 2개일 경우 00, 11
# 타일이 3개일 경우 100, 001, 111
# 타일이 4개일 경우 1100, 1001, 1111, 0000, 0011
# 이처럼 나열해보면 2보다큰 n개의 타일로 만들 수 있는 타일의 형태는 1타일 1개와 n-1개의 타일로
# 만들어지는 조합과 00타일에 n - 2개의 타일로 만드는 조합들을 합친 형태가 됩니다.
dp = [1, 2]
# 따라서 dp에 1개의 타일과 2개의 타일로 만들수 있는 조합을 인덱스에 넣어주고
n = int(input())
for i in range(2, n):
    dp.append((dp[i - 1] + dp[i - 2])%15746)
    # n-1개의 인덱스가 될 때까지 i-1, i-2의 합을 15746으로 나눈값을 넣어준다음
print(dp[n-1])
# dp[n-1]의 위치에 있는 값을 출력합니다.

'알고리즘(algorithm) > 백준' 카테고리의 다른 글

백준 1924 2007년 python  (0) 2023.02.10
백준 10815 숫자 카드 python  (0) 2023.02.10
백준 10282 해킹 python  (0) 2023.02.09
백준 1149 RGB거리 python  (0) 2023.02.08
백준 1260 DFS와 BFS python  (0) 2023.02.08