반응형
https://www.acmicpc.net/problem/2193
2193번: 이친수
0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다. 이친수는 0으로 시작하지 않
www.acmicpc.net
드디어! 혼자 힘으로 풀었습니다😆 DP를 풀다 보니 이제는 요령이란 게 생긴 것 같습니다.
이친수라는 문제는 1과 0으로 이루어진 숫자를 의미하는데 두 가지 조건을 지켜야만 합니다. 첫 번째, 0으로 시작하면 안 된다. 두 번째, 1이 두 번 연속 있으면 안 된다.
그래서 저는 숫자의 일의 자리가 0일 때와 1일 때를 구분해서 값을 넣어주었더니 메모리 초과로 실패했습니다..
n = int(input())
dp = [[1], [0]]
for i in range(2, n+1):
dp.append([])
for j in range(0, len(dp[i-1])):
if dp[i-1][j] == 0:
dp[i].append(0)
dp[i].append(1)
elif dp[i-1][j] == 1:
dp[i].append(0)
print(len(dp[n-1]))
그래서 또 다른 규칙이 있는지 살펴본 결과! 일의 자리가 0이면 0, 1이 올 수 있고, 1이면 0만 온다는 걸 알아채고 전체 수에서 일의 자리가 0인 개수만큼 0과 1이 생기고, 일의 자리가 1인 개수만큼 0이 생긴다는 규칙을 찾아냈습니다.
n = int(input())
sum = 0
dp = [[0, 1], [1, 0]]
for i in range(2, n):
dp.append([0, 0])
if dp[i-1][0] > 0:
dp[i][0] += dp[i-1][0]
dp[i][1] += dp[i-1][0]
if dp[i-1][1] > 0:
dp[i][0] += dp[i-1][1]
for i in range(2):
sum += dp[n-1][i]
print(sum)
DP 문제는 우선 손으로 그려본 다음에 규칙을 찾아내면 풀 수 있는 것 같습니다.
728x90
'코딩테스트' 카테고리의 다른 글
백준 DP - 스티커(파이썬) (2) | 2023.11.27 |
---|---|
백준 DP 문제 - 2xN 타일링 만들기 (파이썬) (1) | 2023.11.25 |
백준 DP 문제 - 1로 만들기 (파이썬) (0) | 2023.11.25 |
백준 for문 문제 - 최소, 최대 구하기(파이썬) (2) | 2023.11.25 |
백준 for문 문제 - 날짜 계산하기(파이썬) (0) | 2023.11.25 |