[Java]白俊1764号


白峻1620号です.
https://www.acmicpc.net/problem/1764

質問する


金ジンヨンが出没した人のリストと聞いたことのない人のリストを渡す時、聞いたことのない人のリストを手に入れるプログラムを作ってください.

入力


1行目は聞いていない人の数N,見ていない人の数Mを与えた.続いて2行目からN行目に出没した人の名前とN+2行目から聞いたことのない人の名前を順に与えます.名前にはスペースがなく、アルファベットの小文字だけで、長さは20以下です.N,Mは500000以下の自然数です.
聞いたことのないリストには重複した名前はなく、聞いたことのないリストも同じだ.

しゅつりょく


リスニング雑誌の数とリストをアルファベット順に印刷します.

入力例

3 4
ohhenrie
charlie
baesangwook
obama
baesangwook
ohhenrie
clinton

サンプル出力

2
baesangwook
ohhenrie

考える


問題はそんなに難しくない.
聞いたことのない人と見たことのない人とが重なる人数.
名前をプリントアウトすればいいです.

アクション


  • 		HashMap<String, Integer> map = new HashMap<>();
    		ArrayList<String> list = new ArrayList<>();
    まず、聞いたことのない人のリストを保存するmapを作成します.
    両方が入っている人を知るためにlistを作りました.

  • 		while(N --> 0) {
    			String name = br.readLine();
    			map.put(name, map.getOrDefault(name, 0)+1);
    		}
    
    		while(M --> 0) {
    			String name = br.readLine();
    			map.put(name, map.getOrDefault(name, 0)+1);
    		}
    最初のwhileサイクルでは、聞いたことのない人の名前をmapに入れます.
    2番目のwhileサイクルでは、及ばない人の名前をmapに再入れます.
    ここではmapのgetOrDefaultメソッドを使用して値を増やします.map.put(name, map.getOrDefault(name, 0)+1);key値name、すなわち、同名の人が現れた場合、value値を1増加させる.最初にないキー値を入力するとvalueは0で始まりますが、重複する名前を入力すると徐々に増加します.
    これで同じ名前が何度入ったかを把握できます.

  • 		Iterator<Entry<String, Integer>> it = map.entrySet().iterator();
    		int count = 0;
    
    		while(it.hasNext()) {
    			Entry<String, Integer> entrySet = (Entry<String, Integer>)it.next();
    
    			if(entrySet.getValue() >= 2) {
    				count++;
    				list.add(entrySet.getKey());
    			}
    		}
    現在、mapのkeyとvalueを出力するために、EntrySet型歪みを作成しました.
    このデータ型からvalue値を取得し、valueが2より大きいキー値をlistに入れるだけです.
    私たちは正しい答えを得ることができます.

    TMI


    聴力が悪い以外に問題があるのではないかと心配しています.

    コード#コード#

    import java.io.*;
    import java.util.*;
    import java.util.Map.Entry;
    
    public class Main {
    
    	public static void main(String[] args) throws Exception {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		StringTokenizer st = new StringTokenizer(br.readLine());
    		StringBuilder sb = new StringBuilder();
    
    		int N = Integer.parseInt(st.nextToken());
    		int M = Integer.parseInt(st.nextToken());
    
    		HashMap<String, Integer> map = new HashMap<>();
    		ArrayList<String> list = new ArrayList<>();
    
    		while(N --> 0) {
    			String name = br.readLine();
    			map.put(name, map.getOrDefault(name, 0)+1);
    		}
    
    		while(M --> 0) {
    			String name = br.readLine();
    			map.put(name, map.getOrDefault(name, 0)+1);
    		}
    
    		Iterator<Entry<String, Integer>> it = map.entrySet().iterator();
    		int count = 0;
    
    		while(it.hasNext()) {
    			Entry<String, Integer> entrySet = (Entry<String, Integer>)it.next();
    
    			if(entrySet.getValue() >= 2) {
    				count++;
    				list.add(entrySet.getKey());
    			}
    		}
    
    		Collections.sort(list);
    
    		sb.append(count+"\n");
    		for(String name : list) {
    			sb.append(name+"\n");
    		}
    
    		System.out.println(sb);
    
    	}
    } // End of class