백준 1764번: 듣보잡 (C++)

2023. 1. 16. 00:42알고리즘/자료구조

 

https://www.acmicpc.net/problem/1764

 

1764번: 듣보잡

첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다.

www.acmicpc.net

 

풀이

set 컨테이너를 활용하면 간단하게 풀 수 있다.

사전순 출력이기 때문에 번거롭게 정렬하지 않아도 된다. (set은 원소 자동 오름차순 정렬)

 

우선, 듣도 못한 사람을 s1에 저장한다.

그리고 보도 못한 사람을 입력 받을 때, s1에 있는 요소랑 같다면 s2에 저장한다.

그 후 s2 사이즈와 s2의 요소들을 출력한다.

 

+ 다른 사람 풀이를 보니 map으로 구현한 방법이 더 빠른 듯 하여 map의 value 값으로 중복체크를 하고 set에 중복된 이름을 넣는 방식으로 코드를 조금 수정했다.

 

전체 코드

#include <iostream>
#include <set>
using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int N, M;
	set<string> s1;
	set<string> s2;
	string name;

	cin >> N >> M;

	for (int i = 0; i < N; i++) {
		cin >> name;
		s1.insert(name);
	}

	for (int i = 0; i < M; i++) {
		cin >> name;
		if (s1.find(name) != s1.end()) s2.insert(name);
	}

	cout << s2.size() << '\n';
	for (auto i : s2) cout << i << '\n';
}

 

수정 코드

#include <iostream>
#include <string>
#include <map>
#include <set>

using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int N, M;
    map<string, int> ma;
    set<string> ans;
    
    cin >> N >> M;

    for (int i = 0; i < N + M; i++) {
        string name;
        cin >> name;
        ma[name]++;
        if (ma[name] > 1) ans.insert(name);
    }

    cout << ans.size() << '\n';
    for (auto i : ans) cout << i << '\n';

}

'알고리즘 > 자료구조' 카테고리의 다른 글

백준 2346번: 풍선 터뜨리기 (C++)  (0) 2023.01.21