diff --git "a/minjeong/DynamicProgramming/2025-04-07-[\353\260\261\354\244\200]-#10844-\354\211\254\354\232\264\352\263\204\353\213\250\354\210\230.py" "b/minjeong/DynamicProgramming/2025-04-07-[\353\260\261\354\244\200]-#10844-\354\211\254\354\232\264\352\263\204\353\213\250\354\210\230.py" new file mode 100644 index 00000000..4d251c12 --- /dev/null +++ "b/minjeong/DynamicProgramming/2025-04-07-[\353\260\261\354\244\200]-#10844-\354\211\254\354\232\264\352\263\204\353\213\250\354\210\230.py" @@ -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) \ No newline at end of file diff --git "a/minjeong/DynamicProgramming/2025-04-09-[\353\260\261\354\244\200]-#1562-\352\263\204\353\213\250\354\210\230.py" "b/minjeong/DynamicProgramming/2025-04-09-[\353\260\261\354\244\200]-#1562-\352\263\204\353\213\250\354\210\230.py" new file mode 100644 index 00000000..2e54e9f7 --- /dev/null +++ "b/minjeong/DynamicProgramming/2025-04-09-[\353\260\261\354\244\200]-#1562-\352\263\204\353\213\250\354\210\230.py" @@ -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) diff --git "a/minjeong/DynamicProgramming/2025-04-10-[\353\260\261\354\244\200]-#2193-\354\235\264\354\271\234\354\210\230.py" "b/minjeong/DynamicProgramming/2025-04-10-[\353\260\261\354\244\200]-#2193-\354\235\264\354\271\234\354\210\230.py" new file mode 100644 index 00000000..847e161d --- /dev/null +++ "b/minjeong/DynamicProgramming/2025-04-10-[\353\260\261\354\244\200]-#2193-\354\235\264\354\271\234\354\210\230.py" @@ -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]) diff --git "a/minjeong/DynamicProgramming/2025-04-12-[\353\260\261\354\244\200]-#2302-\352\267\271\354\236\245\354\242\214\354\204\235.py" "b/minjeong/DynamicProgramming/2025-04-12-[\353\260\261\354\244\200]-#2302-\352\267\271\354\236\245\354\242\214\354\204\235.py" new file mode 100644 index 00000000..af9ebd8f --- /dev/null +++ "b/minjeong/DynamicProgramming/2025-04-12-[\353\260\261\354\244\200]-#2302-\352\267\271\354\236\245\354\242\214\354\204\235.py" @@ -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) \ No newline at end of file