[ Baekjoon ] 1764번 ( SILVER VI ) : 듣보잡 (Java)

ma.caron_g·2022년 6월 10일
0

Class3 - Baekjoon

목록 보기
6/13
post-thumbnail

1. Problem 📃

[ 듣보잡 ]

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


[ 문제 ]

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


2. Input ⌨️

[ 입력 ]

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

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


3. Output 🖨

[ 출력 ]

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


4. Example 📚

[ 입출력 예시 ]

예제 입력예제 출력
3 4
ohhenrie
charlie
baesangwook
obama
baesangwook
ohhenrie
clinton
2
baesangwook
ohhenrie

5. Solution 🔑

방법1이 메모리를 더 적게 잡아먹어서 적어보았다... 간단한건 방법2가 좀 더 간단한 거 같다.

[ 방법 1 ]
1. 해쉬맵(set)과 리스트(list)를 정의합니다. 해쉬맵은 키를 이름으로 값은 불린 횟수를 넣어주는 의미로 <String, Integer>를 타입으로 넣어주었습니다.
2. 듣도 못한 사람의 수(N), 보도 못한 사람의 수(M)의 변수를 정의하여 값을 입력하여줍니다.
3. 값을 입력 받으면서 set에 추가하는데, 만약 추가 돼 있다면 값을 가져와 그 값에 1을 더한 값을 넣어줍니다. 아니라면 이름을 넣고 값 1을 추가해줍니다.
4. EntrySet()을 이용하여 기존 set을 EntrySet으로 바꾸어주고 EntrySet을 Iterator를 이용해 모든 값을 하나씩 확인한다.
5. 만약, getValue를 통해서 불린 횟수(Value)이 1이 넘어간다면 듣도 보도 못한 사람이므로 그 사람의 이름(Key)을 리스트에 넣어준다.
6. 리스트를 정렬하고 리스트의 사이즈와 리스트에 있는 이름들을 출력하여준다.

방법 2는 굳이 Set이 필요할까싶다. 리스트를 선언하여 거기에 포함 돼 있는 이름이라면 그 사람을 또 다른 리스트에 넣고 그 리스트를 출력하면 된다. (조건에 중복되는 각각 이름이 없다했으므로)

[ 방법 2 ]
1. 해쉬맵(set)과 리스트(list)를 정의합니다. 해쉬맵은 키를 이름으로 값은 불린 횟수를 넣어주는 의미로 <String, Integer>를 타입으로 넣어주었습니다.
2. 듣도 못한 사람의 수(N), 보도 못한 사람의 수(M)의 변수를 정의하여 값을 입력하여줍니다.
3. 값을 입력받으면서 만약 해쉬맵에 포함되어 있는 Key라면, 리스트에 넣어줍니다.
4. 리스트를 정렬하여주고 리스트의 사이즈와 리스트의 사람들을 출력하여줍니다.

6. Code 💻

[ 방법 1 ]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		
		HashMap<String, Integer> set = new HashMap<>();
		ArrayList<String> list = new ArrayList<String>();
		
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		
		for(int i=0; i<N+M; i++) {
			String name = br.readLine();
			if(!set.containsKey(name)) {
				set.put(name, 1);
			}
			else {
				set.put(name, set.get(name)+1);
			}
		}
		
		Set s = set.entrySet();
		Iterator it = s.iterator();
		while(it.hasNext()) {
			Entry<String, Integer> entry = (Entry)it.next();
			if(entry.getValue() > 1) {
				list.add(entry.getKey());
			}
		}
		
		Collections.sort(list);
		System.out.println(list.size());
		for(int i=0; i<list.size(); i++) {
			System.out.println(list.get(i));
		}
	}		
}

[ 방법 2 ]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		
		Set<String> set = new HashSet<String>();
		ArrayList<String> hearsay = new ArrayList<String>();
		
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		
		for(int i=0; i<N+M; i++) {
			st = new StringTokenizer(br.readLine());
			String name = st.nextToken();
			if(set.contains(name)) {
				hearsay.add(name);
			}
			set.add(name);
		}
		
		Collections.sort(hearsay);
		
		System.out.println(hearsay.size());
		for(int i=0; i<hearsay.size(); i++) {
			System.out.println(hearsay.get(i));
		}
	}

}

7. Growth 🍄

Key와 Value를 모두 가져오려면 EntrySet()을, 키만 가져오고 싶다면 KeySet()을 사용한다.
profile
다른 사람이 만든 것을 소비하는 활동보다, 내가 생산적인 활동을 하는 시간이 더 많도록 생활화 하자.

0개의 댓글