https://www.acmicpc.net/problem/1764
- 문제
- 문제 풀이
백준 1764번 듣보잡은 실버 4 난이도의 문자열, 해시 맵, 그리고 정렬을 사용해서 푸는 문제이다. 이 많은 것들이 한 문제에 들어있지만 그래도 어려운 거 없는 간단한 문제이다.
이 문제에서는 듣도 못한 사람의 수 n, 그리고 보도 못한 사람의 수 m이 주어진다. 그리고 그다음 n 줄 만큼의 사람의 이름이 주어지고 m 줄 만큼의 사람의 이름들이 주어진다. 듣도 못한 사람이기도 하고 보도 못한 사람이 이 문제에서 찾는 듣보잡이다.
이 문제는 우선 HashMap을 이용해서 푼다. Key는 String, Value는 Integer로 한다. Key는 사람의 이름을 저장할 것이고, Value로는 이 사람이 Map에 들어간 횟수를 저장할 것이다. 그리고 입력으로 듣도 못한 사람들의 이름이 주어질 때 이 HashMap에 Value는 1로 저장한다. 그리고 보도 못한 사람들의 이름을 입력으로 받을 때 그 사람이 Map에 이미 들어있으면 Value는 2로 수정하고 없으면 Value 1로 그대로 Map에 넣는다.
이 문제에서는 getOrDefault (Object Key, V defaultValue)라는 함수를 이용할 것이다. getOrDefault 함수는 찾는 키가 맵에 있으면 찾는 키의 값을 반환하고 없으면 기본 값을 반환하는 함수이다. 이 함수는 맵을 이용할 때 자주 사용하는 메서드이기 때문에 꼭 알아두는 것이 좋다.
getOrDefault (Object Key, V defaultValue)
이 함수에는 2개의 매개변수가 있다. 우선 Object Key는 값을 가지고 와야 하는 요소의 키다. 즉, 이 문제에서는 사람의 이름이 되겠다. 그리고 defaultValue는 지정된 키로 매핑된 값이 없는 경우 반환되어야 하는 기본값이다. 이 함수의 사용법은 밑에 있는 코드를 참고하면 되겠다.
여기까지 왔으면 듣도 못한 사람의 이름, 그리고 보도 못한 사람의 이름을 HashMap에 넣었다. 그리고 듣도 보도 못한 사람은 이 맵에서 값이 2이다. 값이 2인 사람들은 ArrayList에 넣어주고 오름차순으로 정렬을 하고 출력만 하면 된다.
이제 이 문제에서 주어진 예제를 한번 보겠다. 이 예제에서는 듣도 못한 사람 3명, 그리고 보도 못한 사람 4명이 다음과 같이 있다.
듣도 못한 사람 : ohhenrie, charlie, baesangwook
보도 못한 사람 : obama, baesangwook, ohhenrie, clinton
듣도 보도 못한 사람은 ohhenrie와 baesangwook 총 2명이다.
- 코드
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));
Map<String, Integer> map = new HashMap<>();
List<String> list = new ArrayList<>();
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
for (int i = 0; i < n; i++) {
map.put(br.readLine(), 1);
}
for (int i = 0; i < m; i++) {
String name = br.readLine();
map.put(name, map.getOrDefault(name,0) + 1);
if (map.get(name) == 2) list.add(name);
}
StringBuilder sb = new StringBuilder();
Collections.sort(list);
sb.append(list.size() + "\n");
for (String s : list) {
sb.append(s + "\n");
}
System.out.print(sb);
}
}
- 후기
비록 자료구조도 이용하고 정렬도 해야 하는 문제였지만 되게 정직한 문제였던 거 같다.
'백준' 카테고리의 다른 글
[백준] 2163번 : 초콜릿 자르기 – JAVA [자바] (0) | 2022.04.18 |
---|---|
[백준] 2480번 : 주사위 세개 – JAVA [자바] (0) | 2022.04.17 |
[백준] 10926번 : ??! – JAVA [자바] (0) | 2022.04.15 |
[백준] 5543번 : 상근날드 – JAVA [자바] (0) | 2022.04.15 |
[백준] 14916번 : 거스름돈 – JAVA [자바] (0) | 2022.04.14 |
댓글