[Java] 백준 1764번 [듣보잡] 자바

: ) YOUNG·2022년 4월 15일
2

알고리즘

목록 보기
99/422
post-thumbnail

백준 1620번
https://www.acmicpc.net/problem/1764


문제

김진영이 듣도 못한 사람의 명단과, 보도 못한 사람의 명단이 주어질 때, 듣도 보도 못한 사람의 명단을 구하는 프로그램을 작성하시오.


입력

첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. 이름은 띄어쓰기 없이 알파벳 소문자로만 이루어지며, 그 길이는 20 이하이다. N, M은 500,000 이하의 자연수이다.

듣도 못한 사람의 명단에는 중복되는 이름이 없으며, 보도 못한 사람의 명단도 마찬가지이다.


출력

듣보잡의 수와 그 명단을 사전순으로 출력한다.


예제 입력

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에 넣고

두 번째 while 반복에서 보다 못한 사람의 이름을 map에 다시 넣는다.

여기서 map의 getOrDefault 메소드를 사용해서 value값을 증가시킨다.

map.put(name, map.getOrDefault(name, 0)+1);
key값인 name즉, 이름이 같은 사람이 나오면 value 값을 1증가 시키라는 의미이다. 처음 없는 key값이 들어가면 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형 Iterator를 만들어준다.

해당 자료형을 통해 value값을 가져와 value가 2 이상인 key값을 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

0개의 댓글