문제
김진영이 듣도 못한 사람의 명단과, 보도 못한 사람의 명단이 주어질 때, 듣도 보도 못한 사람의 명단을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다.
이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다.
이름은 띄어쓰기 없이 알파벳 소문자로만 이루어지며, 그 길이는 20 이하이다.
N, M은 500,000 이하의 자연수이다.
듣도 못한 사람의 명단에는 중복되는 이름이 없으며, 보도 못한 사람의 명단도 마찬가지이다.
출력
듣보잡의 수와 그 명단을 사전순으로 출력한다.
해결 방법
- 중복을 허용하는 list와 허용하지 않는 set을 둘 다 만든다
- set을 list_set으로 변환하고 list와 list_set 둘 다 오름차순 정렬한다
- 중복 개수 = list.size - list_set.size
- list에서 현재 값과 이전 값이 같으면 출력
public class Week02_1764 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 중복 x Set, 중복 o list 생성 Set<String> set = new HashSet<>(); List<String> list = new ArrayList<>(); // input String[] nm = br.readLine().split(" "); int n = Integer.parseInt(nm[0]); int m = Integer.parseInt(nm[1]); for (int i = 0; i < n; i++) { String a = br.readLine(); list.add(a); set.add(a); } for (int i = 0; i < m; i++) { String b = br.readLine(); list.add(b); set.add(b); } // 변환 후 정렬 List<String> list_set = new ArrayList<>(set); Collections.sort(list_set); Collections.sort(list); // 중복 개수 bw.write(list.size() - list_set.size() + "\n"); // 중복 문자열 출력 for (int i = 1; i < list.size(); i++) { if (list.get(i).equals(list.get(i - 1))) { bw.write(list.get(i)+"\n"); } } bw.flush(); bw.close(); br.close(); } }
'algorithm' 카테고리의 다른 글
| [BOJ] 10819. 차이를 최대로 (0) | 2022.10.27 |
|---|---|
| [BOJ] 9935. 문자열 폭발 (0) | 2022.10.21 |
| [BOJ] 17298. 오큰수 (0) | 2022.10.21 |
| [BOJ] 2309. 일곱 난쟁이 (0) | 2022.10.21 |
| [BOJ] 1620. 나는야 포켓몬 마스터 이다솜 (0) | 2022.10.21 |