본문 바로가기
ps/boj

2193번 Python

by choi-dev 2024. 8. 22.

이번에도 점화식을 먼저 찾기 위해 0이 마지막일 때, 1이 마지막일 때를 비교해보았다.

 

d[1][0] = 0
d[1][1] = 1

d[2][0] = 1
d[2][1] = 0

d[3][0] = 1
d[3][1] = 1

마지막 값이 0번째인 거부터 확인해보면 d[3][0] = d[1][0] + d[2][0]이라는 것을 확인할 수 있다.

 

d[i][j] = d[i-2][j] + d[i-1][j]

다음과 같은 점화식을 구해낼 수 있다.

 

import sys

n = int(sys.stdin.readline())
dp = [[0] * 2 for _ in range(n + 1)]
cnt = 0

for i in range(1, 3):
    dp[i][0] = cnt
    cnt += 1

cnt -= 1

for i in range(1, 3):
    dp[i][1] = cnt
    cnt -= 1

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

print(sum(dp[n]))

처음에는 이렇게 코드를 구성했는데 런타임 에러가 났다. 뒤늦게 확인해보니 n이 1인 경우에는 out of range가 발생했다.

 

import sys

n = int(sys.stdin.readline())
dp = [[0] * 2 for _ in range(n + 1)]
cnt = 0

if n >= 1:
    dp[1][0] = 0
    dp[1][1] = 1

if n >= 2:
    dp[2][0] = 1
    dp[2][1] = 0

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

print(sum(dp[n]))

분기문을 통해 1, 2일 때는 그냥 dp 리스트에 고정값으로 넣게 바꾸면서 정답이 될 수 있었다.

 

import sys

n = int(sys.stdin.readline())
dp = [0] * (n + 1)
dp[1] = 1

if (n > 1): dp[2] = 1

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

print(dp[n])

그런데 사실 이는 2차 배열로 구성할 이유가 전혀 없었다. 각 자릿수의 배열 합을 놓고 보면 결국 피보나치 수열 형태가 되어버리는 것이고 이는 dp의 기본 개념이기에 적용했을 때 바로 정답이 될 수 있었다.

'ps > boj' 카테고리의 다른 글

11726번 Python  (0) 2024.11.26
1463번 Python  (0) 2024.11.26
11057번 Python  (0) 2024.08.22
10844번 Python  (0) 2024.08.21
9095번 Python  (0) 2024.08.20