Python/백준

2482_색상환

728x90

https://www.acmicpc.net/problem/2482

 

2482번: 색상환

첫째 줄에 N색상환에서 어떤 인접한 두 색도 동시에 선택하지 않고 K개의 색을 고를 수 있는 경우의 수를 1,000,000,003 (10억 3) 으로 나눈 나머지를 출력한다.

www.acmicpc.net

 

 

dp를 2차원배열로 설정해서 풀 수 있다.

 

dp[i][j]라면 i개의 색중에서 j개의 색을 선택하는 것이다.

 

dp를 채워나간다고 생각해보자.

 

만약 dp[i][j]를 채운다고 생각해보자.

 

i번째 색이 새로 추가되었다면 그 색을 칠하는 경우와 안 칠하는 경우 2가지가 나올 것이다.

 

만약 색이 추가되었다면 i-1번째색은 칠할 수 없고, 이때 색을 칠한다면 j-1개를 구해야 하므로

 

i-2 개의 색으로 j-1개의 색을 칠하는 경우와 같을 것이다.

색을 칠하지 않는다면, i-1개의 색으로 j개의 색을 칠하는 경우와 같다.

 

이때 만약 i가 n이라면 i-1뿐 아닌, 맨 처음색도 고를 수 없으므로 i-3개와 골라야 한다!

 

import sys

n = int(input())
k = int(input())

dp = [ [0] * (k + 1) for _ in range(n+1) ]

for i in range(n+1):
    dp[i][1] = i

for i in range(2,n+1):
    for j in range(2,k+1):
        if i!=n:
            dp[i][j] = dp[i-2][j-1] + dp[i-1][j]
        else:
            dp[i][j] = dp[i-3][j-1] + dp[i-1][j]
        dp[i][j] %= 1000000003
print(dp[-1][-1])
728x90

'Python > 백준' 카테고리의 다른 글

1786_찾기  (0) 2022.06.11
11659_누적합  (0) 2022.06.10
11478_서로다른부분문자열의 개수  (0) 2022.06.06
14425_문자열 집합  (0) 2022.06.02
17404_RGB거리2  (0) 2022.06.01