본문 바로가기
자료구조, 알고리즘/백준 문제풀이

[백준 14425] 문자열 집합 C++

by 선의 2022. 8. 3.

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;
}