본문 바로가기
코딩테스트 준비/백준

[백준 1764번][C++] 듣보잡

by 스테디코디스트 2023. 8. 2.
반응형

<문제 소개>


<소스 코드>

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <map>
#include <unordered_map>
#include <set>
#include <cmath>
#include <stack>
#include <queue>
#include <algorithm>
#include <cstdlib>
using namespace std;

int main()
{
	// 쓰레드 환경이 아닐때 버퍼를 분리하여 처리속도를 빠르게 해줌
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N, M;
	cin >> N >> M;

	map<string, int> list; 

	for (int i = 0; i < N; i++)
	{
		string name;
		cin >> name;

		list[name]++;
	}

	int num = 0; // 듣보잡의 갯수

	for (int i = 0; i < M; i++)
	{
		string name;
		cin >> name;

		list[name]++;

		if (list[name] > 1)
		{
			num++;
		}
	}

	cout << num << "\n";

	for (map<string, int>::iterator iter = list.begin(); iter != list.end(); iter++)
	{
		if (iter->second > 1)
		{
			cout << iter->first << "\n";
		}
	}

	return 0;
}

 


<풀이과정>

1. N과 M을 입력받고, 듣도못한 사람과 보도못한 사람이 나온 갯수를 세어줄 map을 선언

2. N만큼 반복하며 map에 해당 이름의 갯수를 증가시키고, M만큼 반복하며 같은 과정을 반복하면서 추가로 해당 갯수가 1을 넘어서면 듣도못한 사람에서 이미 체크한 경우이므로 듣보잡에 해당된다. 따라서 듣보잡의 갯수를 증가시켜준다.

3. 반복이 끝나면 듣보잡의 갯수가 나오므로 해당 갯수를 출력한다.

4. map의 원소들을 돌면서 value에 해당되는 값이 1을 넘어서면 중복해서 나온 것이므로 해당 key값인 이름을 출력해준다.


<코멘트>

무난하게 쉽게 풀었던것 같다.

(사실 처음에 갯수 세고 출력해야 되는거 못봐서 틀렸음..ㅋㅋ)


<제출결과>