[BOJ] 2482번 : 색상환

2024. 10. 8. 18:47Algorithm

1. problem : 

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

 

 

2. solution 1 :

#include <bits/stdc++.h>
using namespace std;
int n, k; 
const int val = 1004;
const int mod = 1e9 + 3;
int d[val][val]; 

int main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0); 
	cin >> n >> k; 
	if (k == 1) {
		cout << n; 
		return 0; 
	}

	for (int i = 1; i <= n; i++) {
		d[i][0] = 1;
		d[i][1] = i;
	}
	for (int i = 3; i <= n; i++) {
		for (int j = 2; j <= k; j++) {
			d[i][j] = (d[i - 2][j - 1] + d[i - 1][j]) % mod;
		}
	}
	int ans = (d[n - 3][k - 1] + d[n - 1][k]) % mod;
	cout << ans;
}

source code 참고 : https://akim9905.tistory.com/71

 

[백준] 2482번 색상환

[적용한 알고리즘] DP [아이디어] 1번과 N번이 둘 다 색칠되는 경우를 제외하고는, 나머지 경우는 선형으로 생각해줘도 된다. dp[N][K] = N 개 짜리 색상환을 중 K 개를 인접하지 않게 칠하는 경우의

akim9905.tistory.com

 

dp를 이용해 풀어야 한다. 여기서 d라는 테이블은 선형에서의 경우의 수를 나타낸다. d [4][2]라고 하면, 색상이 4개 있고, 2개를 뽑을 때 경우의 수다. 따라서, 마지막 색상을 택하느냐, 아니냐에 따라서 경우를 나눠줘야 한다. 

이때는, d[2][1] (마지막 색상을 뽑았을 때) + d [3][2] (마지막 색상을 뽑지 않았을 때)가 d [4][2]가 된다. 

그리고 마지막 int ans를 출력할 때는 d[n-3][k-1] + d [n-1][k]로 구하는데, 그 이유는 고리형태이기 때문이다. 만약에 마지막 색상을 뽑았을 때는 n-1번째와 1번째는 사용하지 못한다. 따라서 d [n-3][k-1]이 나온다. 반면, 마지막 색상을 뽑지 않았을 때는 d [n-1][k]가 나오게 된다. 

'Algorithm' 카테고리의 다른 글

[BOJ] 1038번 : 감소하는 수  (2) 2024.10.11
[BOJ] 1011번 : Fly me to the Alpha Centauri  (1) 2024.10.10
[BOJ] 11660번 : 구간 합 구하기 5  (0) 2024.10.07
[BOJ] 9657번 : 돌 게임 3  (1) 2024.10.06
[BOJ] 1520번 : 내리막 길  (0) 2024.10.05