백준 문제풀이

14425 번 : 문자열 집합

하다블 2023. 8. 29. 18:51
반응형

문제는 다음과 같습니다.

https://www.acmicpc.net/problem/14425

 

14425번: 문자열 집합

첫째 줄에 문자열의 개수 N과 M (1 ≤ N ≤ 10,000, 1 ≤ M ≤ 10,000)이 주어진다.  다음 N개의 줄에는 집합 S에 포함되어 있는 문자열들이 주어진다. 다음 M개의 줄에는 검사해야 하는 문자열들이 주어

www.acmicpc.net

 

풀이 코드는 다음과 같습니다.

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
	int n,m;
	cin>>n>>m;
	vector<string>v(n);
	for(int i{0};i<n;i++)
	{
		cin>>v[i];
	}
	int count{0};
	sort(v.begin(),v.end());
	for(int i{0};i<m;i++)
	{
		string tmp;
		cin>>tmp;
		if(binary_search(v.begin(),v.end(),tmp))
			count++;
	}
   cout<<count;
   return 0;
}

아마 많은 사람들이 vector를 사용하면 find로 값을 찾을 것이라고 생각합니다.

그래서 다음과 같은 코드를 사용해서 제출하는 사람도 있었을 것이라 생각합니다.

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
	int n,m;
	cin>>n>>m;
	vector<string>v(n);
	for(int i{0};i<n;i++)
	{
		cin>>v[i];
	}
	int count{0};
	for(int i{0};i<m;i++)
	{
		string tmp;
		cin>>tmp;
		if(find(v.begin(),v.end(),tmp)!=v.end())
			count++;
	}
   cout<<count;
   return 0;
}

하지만 문자열의 개수가 10,000개 주어지기 때문에 일일이 모든 원소를 찾아보게 되면 시간초과에 걸릴 수 있습니다.

따라서 이진 탐색을 사용하였고 이진 탐색의 경우에는 vector를 정렬해서 사용해야 합니다.

그 점만 잊지 않고 푸신다면 해결할 수 있는 문제였습니다.

반응형

'백준 문제풀이' 카테고리의 다른 글

7785 번 : 회사에 있는 사람  (0) 2023.08.29
1735 번 : 분수 합  (0) 2023.07.19
13241 번 : 최소공배수  (0) 2023.07.14
9665 번 : 돌 게임  (0) 2023.06.23
1935 번 : 후위표기식2  (0) 2023.06.07