[SWEA] 3316. 동아리실 관리하기 (C++, 라이브러리 X)
Algorithm 카테고리의 다른 글
비트연산자 기본문제
풀이
동아리원이 총 4명이므로 4비트로 모든 경우의 수를 표현할 수 있음.
0b0000부터 0b1111까지(0 부터 15까지) 1씩 더해가면 경우의 수를 체크하며 카운트.
코드 GitHub
#include<iostream>
using namespace std;
int main(int argc, char** argv)
{
int test_case;
int T;
freopen("input.txt", "r", stdin);
cin>>T;
for(test_case = 1; test_case <= T; ++test_case)
{
char chiefs[10000];
int pivot = 0;
int *counts = new int[16];
cin >> chiefs;
for(int i = 0; i < 16; i++) counts[i] = 0;
counts[1]++;
while(chiefs[pivot]) {
int *newCnts = new int[16];
for(int i = 0; i < 16; i++) newCnts[i] = 0;
int chief = chiefs[pivot] - 'A';
for(int i = 0; i < 16; i++) {
if(!(i & 1 << chief)) continue;
long long cnt = 0;
for(int j = 0; j < 16; j++) {
if(!(j & i)) continue;
cnt += counts[j];
if(cnt > 1000000007) cnt %= 1000000007;
}
newCnts[i] = cnt;
}
delete counts;
counts = newCnts;
pivot++;
}
int sum = 0;
for(int i = 0; i < 16; i++) {
sum += counts[i];
if(sum > 1000000007) sum %= 1000000007;
}
delete counts;
cout << '#' << test_case << ' ' << sum << endl;
}
return 0;
}
댓글남기기