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;
}
'자료구조, 알고리즘 > 백준 문제풀이' 카테고리의 다른 글
[백준 18870] 좌표 압축 (0) | 2022.07.28 |
---|---|
[백준 2606] 바이러스 (0) | 2022.06.21 |
[백준] 6588 골드바흐의 추측 (0) | 2022.04.02 |
[백준] 1406 에디터 (0) | 2022.03.06 |
[백준 4375] 모듈로 연산이란? (0) | 2022.02.16 |