백준

백준 1497 - 기타콘서트

황태건 2023. 8. 6. 14:58

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

 

1497번: 기타콘서트

첫째 줄에 기타의 개수 N과 곡의 개수 M이 주어진다. N은 10보다 작거나 같은 자연수이고, M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 기타의 이름과 기타가 연주할 수 있는 곡의

www.acmicpc.net

N과 M의 크기가 크지 않아 비트마스킹 기법으로 풀 수 있는 문제

 

문제 접근 방식은 이런 식이다.

기타 N개로 만들 수 있는 2^N개의 조합(공집합 제외)에 대해, 각 조합에 속한(& 연산 사용) 기타들을 모두 사용했을 때 연주할 수 있는 곡 수가 최대가 되는 조합을 찾으면 된다.

 

코드 보기

더보기
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using namespace std;

int main() {
	int N, M, i;
	cin >> N >> M;

	vector<string> v;
	string str;
	for (i = 0; i < N; i++) {
		cin >> str; cin >> str;
		v.push_back(str);
	}
	int max = 0, cnt = -1;

	int guitar, song;
	for (int i = 0; i < (1 << N); i++) {
		vector<int> vis(M);
		guitar = song = 0;

		//i : 사용 가능한 기타의 조합
		//j : 사용하는 기타
		for (int j = 0; j < N; j++) {
			if (i & (1 << j)) {
				guitar++;
				for (int k = 0; k < M; k++) {
					if (v[j][k] == 'Y' && vis[k] == 0) {
						vis[k] = 1;
						song++;
					}
				}
			}
		}

		if (song > max) {
			//곡의 개수가 더 많아지면 cnt 갱신
			max = song;
			cnt = guitar;
		}
		else if (song == max && cnt > guitar) {
			//곡의 개수가 동일할 때는 cnt를 최소값으로
			cnt = guitar;
		}
	}

	cout << cnt << endl;
}