728x90
반응형
문제
김진영이 듣도 못한 사람의 명단과, 보도 못한 사람의 명단이 주어질 때, 듣도 보도 못한 사람의 명단을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. 이름은 띄어쓰기 없이 알파벳 소문자로만 이루어지며, 그 길이는 20 이하이다. N, M은 500,000 이하의 자연수이다.
듣도 못한 사람의 명단에는 중복되는 이름이 없으며, 보도 못한 사람의 명단도 마찬가지이다.
출력
듣보잡의 수와 그 명단을 사전순으로 출력한다.
입력예제
3 4
ohhenrie
charlie
baesangwook
obama
baesangwook
ohhenrie
clinton
출력예제
2
baesangwook
ohhenrie
풀이
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = scanner.nextInt(); // 듣도 못한 사람
int m = scanner.nextInt(); // 보도 못한 사람
// name[] 안에 모든 이름 다 입력받기
String[] name = new String[n+m];
for (int i = 0; i < n+m; i++) {
name[i] = scanner.next();
}
// hashmap <이름, 중복여부 숫자>
HashMap<String, Integer> arrn = new HashMap<>();
// n부분에는 중복이 없기 때문에
// m 시작점부터 중복일 경우 value에 1을 넣고,
// 중복이 아니면 value에 0을 넣음
for (int i = 0; i < m+n; i++) {
String y = name[i];
if (i >= n) {
if (arrn.get(y) == null) {
arrn.put(y, 0);
} else {
int x = arrn.get(y);
arrn.put(y, x + 1);
}
} else {
arrn.put(y, 0);
}
}
// value가 1인 key 찾아서 newName[] 에 넣기
String[] newName = Arrays.stream(name).distinct().toArray(String[]::new);
ArrayList<String> list = new ArrayList<>();
// 중복인 숫자를 카운팅하는 변수 x
int x = 0;
for (int i = 0; i < newName.length; i++) {
if (arrn.get(newName[i]) == 1){
x++;
list.add(newName[i]);
}
}
// 정렬 후 출력
bw.write(String.valueOf(x) + "\n");
Collections.sort(list);
for (int i = 0; i < list.size(); i++) {
bw.write(list.get(i) + "\n");
}
bw.flush();
bw.close();
}
}
728x90
반응형
'백준' 카테고리의 다른 글
[JAVA] 백준 11478번 서로 다른 부분 문자열의 개수 (0) | 2023.05.05 |
---|---|
[JAVA] 백준 1269번 대칭 차집합 (0) | 2023.05.05 |
[JAVA] 백준 10816번 숫자 카드2 (0) | 2023.05.03 |
[JAVA] 백준 1620번 나는야 포켓몬 마스터 이다솜 (0) | 2023.05.01 |
[JAVA] 백준 7785번 회사에 있는 사람 (0) | 2023.05.01 |