반응형
문제 출처 : https://www.acmicpc.net/problem/1764
문제
김진영이 듣도 못한 사람의 명단과, 보도 못한 사람의 명단이 주어질 때, 듣도 보도 못한 사람의 명단을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. 이름은 띄어쓰기 없이 영어 소문자로만 이루어지며, 그 길이는 20 이하이다. N, M은 500,000 이하의 자연수이다.
듣도 못한 사람의 명단에는 중복되는 이름이 없으며, 보도 못한 사람의 명단도 마찬가지이다.
출력
듣보잡의 수와 그 명단을 사전순으로 출력한다.
알고리즘 분류
풀이
단순 중복을 찾는 문제인데, 중복된 명단을 사전 순으로 정렬해서 출력해야 하고,
Brute Force로 문제를 풀면 시간 초과가 나온다.
첫 번째 풀이에선 map을 이용해 중복을 찾아줬고, 중복된 이름은 vector에 넣어서 오름차순 정렬했다.
두 번째 풀이에선 듣도 못한 사람의 배열을 오름차순으로 정렬하고, 보도 못한 사람을 차례대로 이분 탐색하여
vt에 넣고 오름차순 정렬했다.
이분 탐색을 이용해 Brute Force지만 map을 이용했을 때 보다 빠른 코드를 짤 수 있다.
코드1(map)
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <map>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
map<string, int> ma;
vector<string> vt;
int n, m;
cin >> n >> m;
for (int i = 0; i < n+m; i++) {
string str;
cin >> str;
ma[str]++;
if (ma[str] > 1)
vt.push_back(str);
}
sort(vt.begin(), vt.end());
cout << vt.size() << '\n';
for (auto o : vt)
cout << o << '\n';
}
코드1(이분탐색)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
vector<string>v,vt;
int n, m;
string s;
cin >> n >> m;
for(int i=0; i<n; i++) {
cin >> s;
v.push_back(s);
}
sort(v.begin(), v.end());
for (int i = 0; i < m; i++) {
cin >> s;
if (binary_search(v.begin(), v.end(), s)) {
vt.push_back(s);
}
}
sort(vt.begin(), vt.end());
cout << vt.size() << "\n";
for (auto o : vt) {
cout << o << "\n";
}
}
반응형
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
백준 10610 30 c++ (문자열) (0) | 2021.06.29 |
---|---|
백준 2902 KMP는 왜 KMP일까? c++(문자열) (0) | 2021.06.28 |
백준 1759 암호 만들기 c++ (문자열) (2) | 2021.06.28 |
백준 2824 최대공약수 c++ (에라토스테네스의 체) (3) | 2021.06.22 |
백준 11399 ATM java (탐욕법) (0) | 2021.06.20 |
댓글