https://www.acmicpc.net/problem/1764
문제
김진영이 듣도 못한 사람의 명단과, 보도 못한 사람의 명단이 주어질 때, 듣도 보도 못한 사람의 명단을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. 이름은 띄어쓰기 없이 알파벳 소문자로만 이루어지며, 그 길이는 20 이하이다. N, M은 500,000 이하의 자연수이다.
듣도 못한 사람의 명단에는 중복되는 이름이 없으며, 보도 못한 사람의 명단도 마찬가지이다.
출력
듣보잡의 수와 그 명단을 사전순으로 출력한다.
예제 입력 1
3 4
ohhenrie
charlie
baesangwook
obama
baesangwook
ohhenrie
clinton
예제 출력 1
2
baesangwook
ohhenrie
N과 M 값을 입력 받은 뒤, 2개의 배열 안에 각각 듣도 못한 사람들과 보도 못한 사람들의 이름 명단을 입력받고 서로 비교해가며 2번 나오는 이름들을 따로 빼서 출력하는 방법도 물론 있겠지만, N과 M 둘 다 최대값이 500,000이기 때문에 단순하게 O(N^2) 브루트포스로 하면 시간 초과가 날 것입니다. 그렇기 때문에 시간복잡도가 상대적으로 훨씬 낮은 이분 탐색 (Bineary Search) 알고리즘을 이용할 것입니다. 이분 탐색 알고리즘의 시간복잡도는 O(log N)밖에 안 되기 때문에 시간 초과에 걸리지 않고 문제를 풀 수 있게 됩니다.
이분 탐색 알고리즘을 직접 함수로 구현해서 사용하는 방법도 있지만, C++의 <algorithm> 라이브러리는 이분 탐색 알고리즘을 기본적으로 탑재하고 있기 때문에 간단하게 이를 사용해서 코드를 짜보았습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
vector <string> v, name;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n, m, cnt = 0;
cin >> n >> m;
for (int i = 0; i < n; i++) {
string s;
cin >> s;
name.push_back(s);
}
sort(name.begin(), name.end());
for (int i = 0; i < m; i++) {
string q;
cin >> q;
if (binary_search(name.begin(), name.end(), q)) {
cnt++;
v.push_back(q);
}
}
cout << cnt << '\n';
sort(v.begin(), v.end());
for (int i = 0; i < v.size(); i++) {
cout << v[i] << '\n';
}
}
|
cs |
'공부 > 코딩' 카테고리의 다른 글
아니 이게 왜 됨? (백준 1067) (Feat. Pragma) (0) | 2023.04.13 |
---|---|
GEC Cup 우승 후기 (0) | 2023.04.02 |
백준 11559번: Puyo Puyo (C++/코드) (0) | 2023.02.07 |
백준 10026번: 적록색약 (C++/코드) (0) | 2022.09.17 |
백준 1977번: 완전제곱수 (C++/코드) (0) | 2022.09.16 |