※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 2482번 문제인 색상환이다.
문제는 아래 링크를 확인하자.

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

 

2482번: 색상환

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

www.acmicpc.net

경우의 수를 세는 문제이다.

 

N은 전체 색상의 수, K는 선택하고자 하는 색상의 수이다.

색상환의 한 곳을 잘라 일렬로 나열하고 사용할 색상에 O, 사용하지 않을 색상에 X를 표시한다고 생각하자.

이때, 관찰을 통해 자른 색상환의 맨 마지막 색상이 "X"일 경우의 수는 "OX" 표기 K개와 "X" 표기 N-2K개를 나열하는 경우의 수와 같다는 것을 알 수 있다.

마찬가지로, 자른 색상환의 맨 마지막 색상이 "O"일 경우의 수는 마지막 칸의 색상을 "O", 첫 칸의 색상을 "X"로 고정한 뒤 "OX" 표기 K-1개와 "X" 표기 N-2K개를 나열하는 경우의 수와 같다는 것을 알 수 있다.

 

남은 일은 조합을 이용하여 위의 값을 계산하여 출력하는 것이다. 단, N=1인 경우 1가지 색을 선택할 수 있다는 점과 조합값을 계산할 때의 index가 음수가 되지 않는지 등을 주의하여 구현하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int comb[1001][1001];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	for (int i = 0; i <= 1000; i++) {
		comb[i][0] = comb[i][i] = 1;
	}

	for (int i = 2; i <= 1000; i++) {
		for (int j = 1; j < i; j++) {
			comb[i][j] = (comb[i - 1][j - 1] + comb[i - 1][j]) % 1000000003;
		}
	}

	int N, K; cin >> N >> K;
	if (N == 1) cout << 1;
	else if (N == K) cout << 0;
	else cout << (comb[N - K][K] + comb[N - K - 1][K - 1]) % 1000000003;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 2631 // C++] 줄세우기  (0) 2021.08.22
[BOJ 1695 // C++] 팰린드롬 만들기  (0) 2021.08.21
[BOJ 12970 // C++] AB  (0) 2021.08.19
[BOJ 1956 // C++] 운동  (0) 2021.08.18
[BOJ 1990 // C++] 소수인팰린드롬  (0) 2021.08.17

+ Recent posts