[BOJ] C++ 1764 "듣보잡" 문제 풀이 _ nov

반응형
반응형

#INFO

난이도 : SILVER4

문제유형 : 탐색 알고리즘

출처 : 1764번: 듣보잡 (acmicpc.net)


#SOLVE

처음에는 시간제한(2s)를 고려하지 않고 단순히 이중 for문을 돌려 두 배열(듣도 못한 사람의 이름, 보도 못한 사람의 이름)을 비교하여 탐색하였더니 시간 초과가 발생하였다.

	int cnt = 0;
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++){
			if(str1[i] == str2[j]) {
				ans.push_back(str1[i]);
				cnt++;
			}
		}
	}

 

따라서 이진탐색 알고리즘(binary_search)을 이용해 문제를 풀이하였다. 단 조심해야 할 부분은 이진 탐색 알고리즘은 배열의 원소가 정렬 되어 있어야 탐색이 가능하기에 입력받은 문자열 배열을 미리 오름차 정렬 해 주어야 한다.

    // binary search 알고리즘은 미리 정렬이 되어 있어야 한다.
	sort(v.begin(), v.end());
	
	int cnt = 0;
	string str;
	for(int i = 0; i < m; i++){
		cin >> str;
		if(binary_search(v.begin(), v.end(), str)){
			ans.push_back(str);
			cnt++;
		}
	}

#CODE

#include <bits/stdc++.h>
using namespace std;

int main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	int n, m;
	cin >> n >> m;
	vector<string> v;
	vector<string> ans;
	
	v.resize(n);
	for(int i = 0; i < n; i++){
		cin >> v[i];
	}
	sort(v.begin(), v.end());
	
	int cnt = 0;
	string str;
	for(int i = 0; i < m; i++){
		cin >> str;
		if(binary_search(v.begin(), v.end(), str)){
			ans.push_back(str);
			cnt++;
		}
	}
	sort(ans.begin(), ans.end());
	
	cout << cnt << '\n';
	for(int i = 0; i < cnt; i++){
		cout << ans[i] << '\n';
	}
	return 0;
}

반응형

댓글

Designed by JB FACTORY