문제 설명
가희는 블로그를 운영하고 있습니다. 가희는 블로그에 글을 쓰기 위해, 메모장에 키워드를 적곤 합니다.
지금까지 메모장에 써진 키워드는 모두 서로 다르며, 총 N개가 존재합니다.
가희는 새로운 글을 작성할 때, 최대 10개의 키워드에 대해서 글을 작성합니다.
이 키워드들 중에 메모장에 있었던 키워드는 가희가 글을 쓴 이후, 메모장에서 지워지게 됩니다.
가희는 블로그에 글을 쓰고 나서, 메모장에 있는 키워드 개수가 몇 개인지 알고 싶습니다. 가희를 도와주세요.
제한 사항
풀이
문제를 요약하면, 미리 작성한 키워드가 있고 블로그에 글을 쓰면서 미리 작성한 키워드가 있다면 해당 키워드를 삭제한다.
모든 글을 작성한 이후 남아있는 키워드에 개수를 출력해야 한다.
문제는 간단하다.
글마다 키워드를 확인하며 미리 작성한 키워드에 포함된다면 삭제하면 된다.
즉, 미리 작성한 키워드에 포함 여부만 알아낼 수 있다면 M번의 순회를 통해 정답을 구할 수 있다.
M개의 글의 키워드는 띄어쓰기가 아니라 ','에 의해 구분되어 입력된다.
따라서, sstream을 이용하여 구분자를 설정해 나눌 수 있다.
stringstream ss;
ss.str(input);
string out;
while (getline(ss, out, ','))
{
auto itr = keywords.find(out);
if (itr != keywords.end())
{
keywords.erase(out);
}
}
키워드 포함 여부는 set을 이용하였다.
문제의 조건에는 모두 다른 키워드를 적었다고 명시되어 있기 때문에 set을 이용해도 문제가 없다.
set은 요소가 추가되며 정렬이 이루어지기 때문에 unordered_set을 이용하는 것이 효율적이지만 set을 사용해도 통과하긴 한다.
정리하자면, M개의 글에서 키워드를 하나씩 분리하여 미리 작성한 키워드에 포함된다면 삭제하고 그렇지 않다면 넘어가면 된다.
모든 과정이 끝나면 set에 남아있는 요소의 개수를 출력하면 된다.
전체 코드
#include <stdio.h>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cmath>
#include <climits>
#include <queue>
#include <map>
#include <unordered_map>
#include <set>
#include <bitset>
using namespace std;
int N, M;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> N >> M;
set<string> keywords;
for (int i = 0; i < N; i++)
{
string keyword;
cin >> keyword;
keywords.insert(keyword);
}
for (int i = 0; i < M; i++)
{
string input;
cin >> input;
stringstream ss;
ss.str(input);
string out;
while (getline(ss, out, ','))
{
auto itr = keywords.find(out);
if (itr != keywords.end())
{
keywords.erase(out);
}
}
cout << keywords.size() << "\n";
}
return 0;
}