문제
김진영이 듣도 못한 사람의 명단과, 보도 못한 사람의 명단이 주어질 때, 듣도 보도 못한 사람의 명단을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. 이름은 띄어쓰기 없이 영어 소문자로만 이루어지며, 그 길이는 20 이하이다. N, M은 500,000 이하의 자연수이다.
출력
듣보잡의 수와 그 명단을 사전순으로 출력한다.
풀이
N 명의 듣지도 못한 사람과 M 명의 보지도 못한 사람 중 공통된 사람을 사전순으로 출력하는 문제이다.
처음엔 N명의 사람을 입력받은 뒤, find 함수를 사용하여 하나씩 찾았는데 시간 초과가 나서 다른 방법으로 탐색을 진행하였다.
이진 탐색 방법을 이용하였는데, 구현을 마치고 나서 C++ 라이브러리에 binary_search라는 함수가 있다는 것을 알았다 8ㅅ8
코드
더보기
#include <iostream>
#include <string>
#include <queue>
#include <algorithm>
using namespace std;
vector<string> listen;
vector<string> see;
int findIndex(string str, int start, int end);
int main() {
int n, m;
cin >> n >> m;
string input;
for (int i = 0; i < n; i++) {
cin >> input;
listen.push_back(input);
}
sort(listen.begin(), listen.end());
for (int i = 0; i < m; i++) {
cin >> input;
if (findIndex(input, 0, listen.size()) != -1)
see.push_back(input);
}
sort(see.begin(), see.end());
printf("%d\n", see.size());
for(int i=0;i<see.size();i++)
cout << see[i] << endl;
}
int findIndex(string str, int start, int end) {
int index = (start + end) / 2;
while (start <= end) {
index = (start + end) / 2;
if (listen[index] == str)
return index;
if (listen[index] > str)
end = index - 1;
else
start = index + 1;
}
return -1;
}
'Old > 백준' 카테고리의 다른 글
백준 4690번 완전 세제곱 // C++ (0) | 2020.02.17 |
---|---|
백준 1620번 나는야 포켓몬 마스터 이다솜 // C++ (0) | 2020.02.16 |
백준 14496번 그대, 그머가 되어 // C++ (0) | 2020.02.16 |
백준 2877번 4와 7 // C++ (0) | 2020.02.16 |
백준 10989번 수 정렬하기3 // C++ (0) | 2020.02.14 |