728x90
알고리즘 설명
문제 설명
주어진 n개의 색상환에서 서로 인접하지 않는 색을 k개 선택해야 한다.
코드 설명
dp를 2차원 배열로 만든다.
dp[i][j] 는 i개의 색상에서 j개의 색을 선택하는 경우의 수를 뜻한다.
다음으로 넘어가는 경우 색을 선택하지 않은 경우 dp[i-1][j], 선택한 경우 dp[i-2][j-1]을 이용할 수 있다.
dp[i][0] : 0개의 색을 선택하는 경우는 항상 1이고,
dp[i][1] : i개의 색에서 1개의 색을 선택하는 경우는 항상 i이다.
시간복잡도 : O(n * k)
MOD = 1000000003
n, k = int(input()), int(input())
# k > n // 2인 경우 결과는 항상 0
if k > n // 2:
print(0)
exit(0)
# DP 테이블 초기화
dp = [[0] * (k + 1) for _ in range(n + 1)]
# 초기 상태
for i in range(n + 1):
dp[i][0] = 1 # 0개의 색을 선택하는 경우의 수는 1입니다.
# DP 테이블 채우기
for i in range(1, n + 1):
for j in range(1, k + 1):
if i - 2 >= 0:
dp[i][j] = (dp[i - 2][j - 1] + dp[i - 1][j]) % MOD
else:
dp[i][j] = dp[i - 1][j] % MOD
# 결과 출력
print((dp[n - 3][k - 1] + dp[n - 1][k]) % MOD)
반응형
'백준 문제풀이 코드저장소 > Gold' 카테고리의 다른 글
Baekjoon 2473. 세 용액 / Python (2) | 2024.07.01 |
---|---|
Baekjoon 2533. 사회망 서비스 (SNS) / Python (1) | 2024.07.01 |
Baekjoon 16724. 피리 부는 사나이 / Python (0) | 2024.07.01 |
Baekjoon 16236. 아기 상어 / Python (0) | 2024.07.01 |