듣보잡

구해야 하는 것

  • 듣지 못한 사람과 보도 못한 사람의 교집합

주어진 자료

  • 듣도 못한 사람의 수 = n
  • 보도 못한 사람의 수 = m
  • n, m <= 500,000
  • 이름의 길이 <= 20

조건

  • 듣보잡 명단을 사전순으로 출력해야 함

계획

  1. n, m을 입력받는다.
  2. 이름을 key로, 개수를 값으로 가지는 맵을 만든다.
  3. n명의 이름을 입력받아서 맵에서 해당 값을 증가시킨다.
  4. m명의 이름을 입력받아서 맵에서 해당 값을 증가시킨다.
  5. 맵의 키 값을 알파벳순으로 정렬한다.
  6. 맵을 돌면서 값이 2 이상인 것을 찾으면 cnt를 증가시키고, 명단 문자열에 더한다.
  7. cnt와 명단을 출력한다.

실행

public class Main {
    public void solution() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        
        // 1. n, m을 입력받는다.
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        
        // 2. 이름을 key로, 개수를 값으로 가지는 맵을 만든다.
        HashMap<String, Integer> map = new HashMap<>();
        
        // 3. n명의 이름을 입력받아서 맵에서 해당 값을 증가시킨다.
        for(int i = 0; i < n; i++) {
            String key = br.readLine();
            
            if(map.get(key) == null) {
                map.put(key, 1);
            } else {
                map.put(key, map.get(key) + 1);
            }
        }
        
        // 4. m명의 이름을 입력받아서 맵에서 해당 값을 증가시킨다.
        for(int i = 0; i < m; i++) {
            String key = br.readLine();

            if(map.get(key) == null) {
                map.put(key, 1);
            } else {
                map.put(key, map.get(key) + 1);
            }
        }

        // 5. 맵의 키 값을 알파벳순으로 정렬한다.
        List<String> keyList = new ArrayList<>(map.keySet());
        keyList.sort(Comparator.naturalOrder());
        
        // 6. 맵을 돌면서 값이 2 이상인 것을 찾으면 cnt를 증가시키고, 명단 문자열에 더한다.
        StringBuilder sb = new StringBuilder();
        int cnt = 0;
        for(String key : keyList) {
            int value = map.get(key);
            if(value >= 2) {
                cnt++;
                sb.append(key + "\n");
            }
        }
        
        // 6. cnt와 명단을 출력한다.
        System.out.println(cnt + "\n" + sb);
    }
    
    public static void main(String[] args) throws IOException {
        new Main().solution();
    }
}