1904-s3 성공
This commit is contained in:
41
workbook_7319/silver/1904-s3.py
Normal file
41
workbook_7319/silver/1904-s3.py
Normal file
@@ -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)과 같다고 할 수 있다.
|
||||||
|
따라서 전혀 지장이 없다.
|
||||||
|
"""
|
||||||
Reference in New Issue
Block a user