Always awake
[백준][1562][Python 파이썬][G1] 계단 수 본문
문제
45656이란 수를 보자.
이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다.
N이 주어질 때, 길이가 N이면서 0부터 9까지 숫자가 모두 등장하는 계단 수가 총 몇 개 있는지 구하는 프로그램을 작성하시오. 0으로 시작하는 수는 계단수가 아니다.
입력
첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다.
출력
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
테스트케이스
10 | 30 | 70 | 100 |
1 | 49050151 | 169463574 | 670667793 |
코드
mod = 1000000000
# dp[숫자길이][최근숫자][방문여부] = 개수
dp = [[[0 for check in range(1024)] for prenum in range(10)]
for length in range(101)]
pows = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512]
def used(a, n):
temp = a >> n
return temp % 2
# 초기값
for i in range(1, 10):
dp[1][i][2**i] = 1
for i in range(1, 100):
for j in range(10):
for k in range(1024):
if dp[i][j][k] == 0:
continue
if j == 0:
if used(k, 1):
dp[i+1][1][k] += dp[i][0][k]
else:
dp[i+1][1][k+2] += dp[i][0][k]
elif j == 9:
if used(k, 8):
dp[i+1][8][k] += dp[i][9][k]
else:
dp[i+1][8][k+256] += dp[i][9][k]
else:
if used(k, j-1):
dp[i+1][j-1][k] += dp[i][j][k]
else:
dp[i+1][j-1][k+pows[j-1]] += dp[i][j][k]
if used(k, j+1):
dp[i+1][j+1][k] += dp[i][j][k]
else:
dp[i+1][j+1][k+pows[j+1]] += dp[i][j][k]
# 테스트
N = int(input())
ans = 0
for i in range(10):
ans += dp[N][i][1023]
print(ans % mod)
후기
와 어려웠다..
다른 계단수 문제를 2차원 dp로 풀었어서 사용한것만 어떻게 기록하면 되겠지.. 싶었고
그 아이디어도 사실 비트마스킹으로 진행하는걸 본적 있어서 하면 되겠다 싶었는데
실제로 구현하는건 꽤나 어려웟다
3차원 dp로 어떻게든 풀었음
'PS > 백준 BOJ' 카테고리의 다른 글
[백준][2342][Python 파이썬][G3] Dance Dance Revolution (0) | 2023.12.07 |
---|---|
[백준][1766][Python 파이썬][G2] 문제집 (1) | 2023.12.04 |
[백준][2623][Python 파이썬][G3] 음악프로그램 (2) | 2023.11.28 |
[백준][2252][Python 파이썬][G3] 줄 세우기 (1) | 2023.11.28 |
[백준][1005][Python 파이썬][G3] ACM Craft (0) | 2023.11.28 |