Post

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

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

문제 링크


1. 문제 풀이

듣도 못한 사람의 명단과 보도 못한 사람의 명단에 모두 포함된 사람의 명단을 사전 순으로 출력하는 문제로 두 집합의 교집합을 구하면 되는 간단한 문제다.


2. 코드

1. 집합과 맵 [Java]

듣도 못한 사람은 TreeSet 으로 보도 못한 사람은 HashSet 으로 저장한 후 retainAll 메서드로 두 집합의 교집합을 구했다. TreeSet 은 이미 정렬된 채로 저장하기 때문에 순회하면서 출력만 해주면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        Set<String> set1 = new TreeSet<>();
        for (int i = 0; i < N; i++) {
            set1.add(br.readLine());
        }

        Set<String> set2 = new HashSet<>();
        for (int i = 0; i < M; i++) {
            set2.add(br.readLine());
        }

        set1.retainAll(set2);

        sb.append(set1.size()).append("\n");
        for (String str : set1) {
            sb.append(str).append("\n");
        }

        System.out.println(sb);
    }
}

2. 집합과 맵 [C++]

set 으로 교집합을 선언하고 한 쪽 집합을 순회하면서 해당 원소가 반대쪽 집합에도 포함되어 있으면 교집합에 넣어주는 방식으로 구현했다. 이때 성능은 순회를 하는 쪽이 좌우하므로 더 작은 집합을 순회하도록 swap 을 활용했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <bits/stdc++.h>
using namespace std;

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

    int n, m;
    cin >> n >> m;

    unordered_set<string> st1;
    for (int i = 0; i < n; i++) {
        string s;
        cin >> s;
        st1.insert(s);
    }

    unordered_set<string> st2;
    for (int i = 0; i < m; i++) {
        string s;
        cin >> s;
        st2.insert(s);
    }

    set<string> inter;
    if (st1.size() > st2.size()) swap(st1, st2);

    for (const string& s : st1) {
        if (st2.count(s)) inter.insert(s);
    }

    cout << inter.size() << '\n';
    for (const string& s : inter) {
        cout << s << '\n';
    }
}

3. 풀이 정보

1. 집합과 맵 [Java]

언어시간메모리코드 길이
Java 11356 ms28772 KB882 B

2. 집합과 맵 [C++]

언어시간메모리코드 길이
C++ 1748 ms12860 KB674 B

This post is licensed under CC BY 4.0 by the author.