Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import sys
input = sys.stdin.readline

'''
DP에는 길이가 i고 j가 마지막 수의 개수가 저장되어야 한다.
'''

N = int(input())
dp = [[0 for _ in range(10)] for _ in range(N+1)]
for i in range(1, 10):
dp[1][i] = 1

for i in range(2, N+1):
for j in range(10):
if j == 0:
dp[i][j] = dp[i-1][1]
elif j == 9:
dp[i][j] = dp[i-1][8]
else:
dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1]

print(sum(dp[N]) % 1000000000)
43 changes: 43 additions & 0 deletions minjeong/DynamicProgramming/2025-04-09-[백준]-#1562-계단수.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import sys
input = sys.stdin.readline

# 1. 입력
N = int(input())
MOD = 10**9


# 2. DP 정의
# dp[n][last_digit][bitmask]
# n: 숫자 길이, last_digit: 마지막 자리 숫자, bitmask: 지금까지 어떤 숫자들이 나왔는지 (비트마스크)
# 범위 - n: 입력값, last_digit: 0~9, bitmask: 0~1023
dp = [[[0 for _ in range(1024)] for _ in range(10)] for _ in range(N+1)]

# 3. 초기상태 설정
# 길이가 1일 때, 0을 제외하고 1~9로 시작할 수 있음
for i in range(1, 10):
dp[1][i][1 << i] = 1

# 4. 점화식대로 DP 채우기
# n: N번째 수
for n in range(2, N+1):
# last_digit: 마지막 자리 숫자
for last_digit in range(10):
# 0~9까지 모든 수를 방문해야 한다는 조건이 있으므로 방문여부를 비트마스킹을 통해 저장
for mask in range(1024):
if last_digit == 0:
dp[n][last_digit][mask | (1 << last_digit)] += dp[n - 1][last_digit + 1][mask]
elif last_digit == 9:
dp[n][last_digit][mask | (1 << last_digit)] += dp[n - 1][last_digit - 1][mask]
else:
dp[n][last_digit][mask | (1 << last_digit)] += (
dp[n - 1][last_digit - 1][mask] + dp[n - 1][last_digit + 1][mask]
)
dp[n][last_digit][mask | (1 << last_digit)] %= MOD

# 5. 정답 계산 및 출력
answer = 0
for i in range(10):
# N자리 수 중에서 i로 끝나는 수 중 0부터 9까지 다 있는 수를 누적해서 더하기
answer += dp[N][i][1023]

print(answer % MOD)
20 changes: 20 additions & 0 deletions minjeong/DynamicProgramming/2025-04-10-[백준]-#2193-이친수.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import sys
input = sys.stdin.readline

'''
이친수:
- 0과 1로 이루어진 수
- 0으로 시작하지 않음
- 1이 두 번 연속으로 나타나지 않음

N이 주어질 때, N자리 이친수의 개수 구하기
'''

N = int(input())
dp = [0] * (N + 1)
dp[1] = 1

for i in range(2, N + 1):
dp[i] = dp[i - 1] + dp[i - 2]

print(dp[N])
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import sys
input = sys.stdin.readline

# 1. 입력
N = int(input()) # 좌석의 개수
M = int(input()) # 고정석의 개수
vip_list = [int(input()) for _ in range(M)] # VIP 고정석 번호 리스트

# 2. DP 초기화
dp = [0] * (N + 1)
dp[0], dp[1] = 1, 1

# 3. 피보나치 수열 기반 DP 채우기
for i in range(2, N+1):
dp[i] = dp[i-1] + dp[i-2]

# 4. 좌석 구간별 계산
answer = 1
prev = 0 # 이전 VIP 좌석 번호

for vip in vip_list:
section = vip - prev - 1 # VIP 좌석 전까지 자유 좌석 구간 길이
answer *= dp[section] # 그 구간에서 가능한 배치 수 곱하기
prev = vip # 현재 VIP를 기준으로 다음 구간 나눌 준비

# 5. 마지막 구간 처리 (VIP 이후 남은 좌석이 있는 경우)
section = N - prev
answer *= dp[section]

print(answer)