diff --git a/workbook_7319/silver/1904-s3.py b/workbook_7319/silver/1904-s3.py new file mode 100644 index 0000000..5fd103d --- /dev/null +++ b/workbook_7319/silver/1904-s3.py @@ -0,0 +1,41 @@ +# 01타일 + +import sys + +input = sys.stdin.readline + +def solution(): + n = int(input().rstrip()) + + mod = 15746 + + dp = [0] * (n+1) + dp[0] = 1 + dp[1] = 1 + + for i in range(2, n+1): + dp[i] = (dp[i-2]+dp[i-1])%mod + + print(dp[n]) + return + + +solution() + +""" +걸린 시간: 19분 + +시간 복잡도: dp 테이블 채우기는 O(n)이다. + +해설: 현재 보는 칸이 생겼을 때 과거의 어느 시점들에서 올 수 있는지 확인해야 한다. -1번째 칸에서 1 타일만 붙인 경우, -2번째 칸에서 00 타일만 붙인 경우이다. +-2번째 칸에서 11을 붙일 수도 있다고 생각할 수 있지만 그건 첫번째 조건에서 고려한 것이다. +하다가 좀 헷갈리면 주어진 방법들을 기준으로 그것들이 쓰일 수 있는 고유한 상황만 확인하면 된다. 따라서 두 상황에서 1가지 경우씩 현재로 올 수 있기 때문에 +dp[i-1]*1 + dp[i-2]*1 이다. +근데 여기서 숫자가 너무 커지면 메모리 초과가 발생할 수 있다.(mod 값으로 답하라는 것이 힌트) +답을 다 dp에 계산하고 마지막에만 mod를 하는건 의미가 없다. +따라서 계산할때마다 mod를 계산해서 그 값을 넣어야 하는데, 그럼 값이 훼손되는게 아닌가 싶다. +이때는 mod의 성질을 살펴보면 되는데 (a+b)%m = ((a%m)+(b%m)%m)이다. +우리가 구해야하는 값은 dp[a+b]%m인데, dp 테이블에 값을 넣는 식과 비교해보면 dp 값에는 mod를 계산한 결과가 계속 들어가고 있고, +그 mod 계산 결과값을 더하고 또 mod를 하기 때문에 이는 ((a%m)+(b%m)%m)과 같다고 할 수 있다. +따라서 전혀 지장이 없다. +""" \ No newline at end of file