※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 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;
}
'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 |