1764 풀이
※ 문제 링크 : https://www.acmicpc.net/problem/1764
이 문제는 개인적으로 재밌는 문제라서 가져왔습니다. 먼저 문제에서 들어보지 못한 사람 N명에 대한 리스트와 그 다음에 보지도 못한 사람 M명에 대한 리스트를 제공을 합니다. 그리고 이 서로 다른 리스트에서 중첩되는 이름을 찾아 듣도 보도 못한 사람을 찾는 게 이 문제의 핵심입니다.
이 문제는 먼저 각 리스트를 벡터로 입력을 받아서 저장을 한 후에 각각의 리스트를 이름 순서대로 정렬을 하도록 합니다.
정렬이 완료되면 아래와 같은 방식으로 탐색을 실시하도록 합니다.
A C E F U V ↑ ↓ B D E U
A C E F U V x ↑ ↓ B D E U
A C E F U V x ↑ x ↓ B D E U
A C E F U V x x ↑ x ↓ `B D E U
A C E F U V x x ↑(MATCH) x x ↓(MATCH) B D E U
A C E F U V x x x ↑ x x x ↓ B D E U
A C E F U V x x x x ↑(MATCH) x x x ↓(MATCH) B D E U
A C E F U V x x x x x ↑ x x x x ↓(HALT) B D E U
이에 따라, 만들어지는 코드는 아래와 같습니다.
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int N, M;
vector<string> cannot_hear;
vector<string> cannot_see;
void init(){
    cin >> N >> M;
    for(int _case = 0; _case < 2; _case++) {
        int how_many = _case == 0 ? N : M;
        for (int i = 0; i < how_many; i++) {
            string name;
            cin >> name;
            if(_case == 0)
                cannot_hear.push_back(name);
            else
                cannot_see.push_back(name);
        }
    }
}
void run(){
    vector<string> cannot_head_and_see;
    sort(cannot_see.begin(), cannot_see.end());
    sort(cannot_hear.begin(), cannot_hear.end());
    vector<string>::iterator search_see = cannot_see.begin();
    vector<string>::iterator search_hear = cannot_hear.begin();
    while(true){
        if(*search_see == *search_hear) {
            cannot_head_and_see.push_back(*search_see);
            *search_see++; *search_hear++;
        }
        else if(*search_see > *search_hear)
            search_hear++;
        else
            search_see++;
        if(search_see  == cannot_see.end() ||
           search_hear == cannot_hear.end() )
            break;
    }
    cout << cannot_head_and_see.size() << endl;
    for(auto i : cannot_head_and_see) cout << i << endl;
}
int main(){
    init();
    run();
}