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;
}
'백준' 카테고리의 다른 글
백준 9252 - LCS 2 (0) | 2023.08.09 |
---|---|
백준 11053 - 가장 긴 증가하는 부분 수열(LIS) (0) | 2023.08.08 |
백준 27499 - 레이저 쏘기 (0) | 2023.08.05 |
백준 16563 - 어려운 소인수분해 (0) | 2023.08.05 |
백준 27650 - 마법박스 (0) | 2023.08.02 |