반응형
1764번: 듣보잡
첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다.
www.acmicpc.net
문제 설명은 다음과 같다.
중복을 체크해서, 그 인원과 사전 순으로 정렬해서 사람 이름을 뱉어야 하는 문제이다.
중복 체크는, C에서 가장 간편한 것은 집합에 밀어 넣어 놓고 insert의 second 값이 false가 나오는지 안나오는지를 tracking 하는 것이라 개인적으로 생각한다.
그래서 그 알고리즘을 짜서 해결하면 될 것이라고 생각했고, 그렇게 해결 했다.
아래는 내가 생각한 사고 방식이다.
1. 우선 집합 하나를 선언한다.
2. 그 집합에 그냥 사람 이름을 다 밀어넣는다.
3. 이 때, insert(사람이름) 의 return 값의 second 값 (set.insert(무언가)의 리턴값은 pair로 나온다.
first는 집어넣은 원소, second는 성공 여부) 이 false라면, 이미 그 집합 안에 넣어져 있다는 것이고, 그 말은 이미 전에 등장 했다는 소리이므로, 자연스레 중복 여부가 파악된다.
4. 중복 여부가 파악된 사람의 이름을 vector 안에 넣어준다.
5. vector를 사전 순으로 정렬해서 size와 그 값들을 출력해주면 끝 !
아래는 그 알고리즘을 간단히 구현한 코드이다.
#include <algorithm>
#include <iostream>
#include <set>
#include <sstream>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
string s;
getline(cin, s);
istringstream ss(s);
set<string> ans;
int a, b;
ss >> a >> b;
int count = 0;
vector<string> what;
for (int i=0;i<a+b;i++){
string test;
cin >> test;
if (ans.insert(test).second == false) {
count++;
what.push_back(test);
}
}
cout << count << '\n';
sort(what.begin(),what.end());
for (auto it : what) cout << it << '\n';
return 0;
}
반응형
'백준 문제풀이 > 백준 Silver' 카테고리의 다른 글
백준 1018 - 체스판 다시 칠하기 [Python] (0) | 2023.11.05 |
---|---|
백준 1620 - 나는야 포켓몬 마스터 이다솜 [C/C++] (0) | 2023.11.04 |
백준 2164 - 카드2 [C/C++] (1) | 2023.11.02 |
백준 2839 - 설탕 배달 [C/C++] (1) | 2023.11.02 |
백준 4949 - 균형잡힌 세상 [C/C++] (0) | 2023.11.02 |