1904-s3 성공

This commit is contained in:
sm4640
2026-03-27 12:13:54 +09:00
parent 77f4339bbf
commit a62fcf41a3

View 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)과 같다고 할 수 있다.
따라서 전혀 지장이 없다.
"""