본문 바로가기
백준알고리즘/동적 계획법1

(Python/🥈3) 1904번: 01타일

by windy7271 2022. 11. 13.
728x90
반응형

문제 출처: https://www.acmicpc.net/problem/1904

 

1904번: 01타일

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

www.acmicpc.net

풀이:

 

먼저 규칙을 알아보기위해 중복순열을 사용하였다

 

from itertools import product

# 길이가 1부터 5까지에 규칙을 알아보기 위해서 1부터 5까지 딕셔너리 생성
number_dic = {i:0 for i in range(1,6)}

lst = ['00','1']
for z in range(1,6): # 1부터 5까지
    for i in product(lst, repeat=z): #중복으로 z갯수만큼 사용해서 만든다.
        x = ''.join(i)	# list에 따로 담기니깐 join으로 합쳐주고
        if len(x) in number_dic: # 만약 길이를 키로 가지고있는 값이 딕셔너리에 있으면
            number_dic[len(x)] += 1 # 추가해준다.
        else:	# 없다면
            pass # 그냥 지나친다
            
# 위 코드를 돌리면
{1: 1, 2: 2, 3: 3, 4: 5, 5: 8} 출력

 

규칙성을 보면 dp 처음배울때 dp[i] = dp[i-1] + dp[i-2] 다

 

 

 제출용 코드 (정답)

 

def dp(n):

    dp = [0] *1000001
    dp[1],dp[2] = 1, 2
    for i in range(3,n+1):
        dp[i] = (dp[i-1] + dp[i-2]) % 15746
    return dp[n]
print(dp(n))

15746 으로 나눠주지않으면 메모리 초과 나옴

반응형

댓글