문제 url:
듣보잡
문제:
문제를 같이 읽어보면서 문제를 살펴보도록 하자,
N은 듣도 못한 사람의 수, M은 보도 못한 사람의 수로 N과 M에 속하는 인원의 이름은 중복값이 없으며 최대 500,000명이 존재한다.
여기서 우리는 듣도 못한 사람과 보도 못한 사람에 속한 사람을 출력하는 문제이다.
우리는 여기서 중복을 허용하지 않으며, 키와 값이 쌍으로 되어 있어, 하나의 키로 값을 불러 올 수 있는 map을 쉽게 떠올릴 수 있는데,
이를 이용해서 한번 코드를 작성해보자.
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 sbd = new StringBuilder();
// N과 M을 공백으로 구분해서 입력
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
// 듣지 못한 사람들을 보관할 map 선언
HashMap<String, Integer> map = new HashMap<>();
// 결과로 듣도 보도 못한 인원을 출력하기 위한 list
List<String> res_list = new ArrayList<>();
for(int i = 0; i < N; i++) {
map.put(br.readLine(), i);
}
// 보도 못한 인원을 입력받는데,
// 단, 듣도 못한 인원 map에 해당 인원이 포함되면 result 리스트에 저장
for(int i = 0; i < M; i++) {
String name = br.readLine();
if(map.containsKey(name)) {
res_list.add(name);
}
}
// 인원을 구하기 위한 로직
sbd.append(res_list.size()).append("\n");
// 명단을 사전순으로 정렬하라고 했기 때문
Collections.sort(res_list);
// 명단 이름을 출력하기 위한 반복문
for(int i = 0; i < res_list.size(); i++) {
sbd.append(res_list.get(i)).append("\n");
}
System.out.println(sbd);
}
}
특별한 설명은 주석으로 대체할 수 있어 핵심 로직만 살펴보겠다.
// 보도 못한 인원을 입력받는데,
// 단, 듣도 못한 인원 map에 해당 인원이 포함되면 result 리스트에 저장
for(int i = 0; i < M; i++) {
String name = br.readLine();
if(map.containsKey(name)) {
res_list.add(name);
}
}
우리는 문제에서 듣도 보도 못한 사람을 찾아야 하는 것이다.
그렇다면 현재 듣도 못한 명단에 보도 못한 사람의 이름이 존재하면! 출력을 위한 리스트에 저장하면 정답을 구할 수 있을 것이다.
이를 위해 필자는 containsKey()메서드를 사용했으며
이는 해당 map에 키 값이 존재한다면 true 그렇지 않으면 false를 반환하는 메서드이다. 그래서 듣도 못한 명단에 보도 못한 사람(key 값)의 유무를 구할 수 있는 것이다.