자료구조, 알고리즘/백준 문제풀이
[백준 14425] 문자열 집합 C++
선의
2022. 8. 3. 01:40
C++의 Map을 활용하면 쉽게 풀 수 있는 문제
Map이란?
키와 값(Key-Value)의 쌍으로 이루어진 데이터의 집합
Key의 중복은 허용하지 않고, Value의 중복은 허용한다
map<string, bool> s;
for (int i = 0; i < n; i++) {
string tmp;
cin >> tmp;
s.insert({ tmp, true });
}
주어진 n개의 문자열을 이렇게 저장한다고 하면, (문자열(Key) - true(Value)) 이런 식으로 저장된다.
다음 m개의 문자열에서 집합 s에 속한 문자열이 몇 개인지를 세는 문제이므로,
(1)문자열을 하나 입력 받고 (2)해당 문자열을 key로 두었을 때 Value가 true인지 확인한 다음 (3)true일 경우 결과값에 +1
이런식으로 검증하면 된다.
처음에는 tmp, false로 저장했는데 답이 안 나와서 다시 생각해보니까 key로 찾았을 때 안 나오면 당연히 false를 반환한다. s에는 a, b, c, d만 있는데 만약 e를 찾는다고 해 보자. 그럼 e가 없으면 false를 반환한다. 따라서 a, b, c, d의 Value는 true가 되어야 한다.
그래서 완성한 코드를 보면
#include <iostream>
#include <vector>
#include <string>
#include <map>
using namespace std;
int n, m;
int main(void) {
cin >> n >> m;
map<string, bool> s;
for (int i = 0; i < n; i++) {
string tmp;
cin >> tmp;
s.insert({ tmp, true });
}
int cnt = 0;
while (m--) {
string tmp;
cin >> tmp;
if (s[tmp] == true) {
cnt++;
// s[tmp] = true; // 중복되는 문자열 없음
}
}
cout << cnt;
return 0;
}