※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1062번 문제인 가르침이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/1062
1062번: 가르침
첫째 줄에 단어의 개수 N과 K가 주어진다. N은 50보다 작거나 같은 자연수이고, K는 26보다 작거나 같은 자연수 또는 0이다. 둘째 줄부터 N개의 줄에 남극 언어의 단어가 주어진다. 단어는 영어 소문
www.acmicpc.net
a, c, i, n, t 다섯 문자를 제외한 알파벳 소문자는 총 21개뿐임을 확인하자.
각 단어에 위 다섯 문자를 제외한 알파벳이 들어있는지 여부는 0과 1의 하나의 비트로 표현할 수 있으므로 21개의 비트를 이용하면 각 단어가 위 다섯문자를 제외하고 어떤 문자가 더 추가로 필요한지를 항상 표현할 수 있다.
위와 같은 비트마스킹을 이용해 문제를 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
using namespace std;
int arr[50];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N, K; cin >> N >> K;
for (int n = 0; n < N; n++) {
int tmp = 0;
string s; cin >> s;
for (auto& l : s) {
if (l == 'b') tmp |= 1;
else if ('c' < l && l < 'i') tmp |= (1 << (l - 'c'));
else if ('i' < l && l < 'n') tmp |= (1 << (l - 'd'));
else if ('n' < l && l < 't') tmp |= (1 << (l - 'e'));
else if ('t' < l) tmp |= (1 << (l - 'f'));
}
arr[n] = tmp;
}
int ans = 0;
for (int i = 0; i < 2097152; i++) {
int ii = i, cnt = 0;
while (ii) {
if (ii & 1) cnt++;
ii >>= 1;
}
if (cnt == K - 5) {
int anscnt = 0;
for (int n = 0; n < N; n++) {
if ((arr[n] & i) == arr[n]) anscnt++;
}
ans = max(ans, anscnt);
}
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 2635 // C++] 수 이어가기 (0) | 2022.08.25 |
---|---|
[BOJ 2636 // C++] 치즈 (0) | 2022.08.24 |
[BOJ 3055 // C++] 탈출 (0) | 2022.08.22 |
[BOJ 25172 // C++] 꼼꼼한 쿠기의 졸업여행 (0) | 2022.08.21 |
[BOJ 25171 // C++] 긴장한 아리와 쿠기의 카드게임 (0) | 2022.08.21 |