[백준/JAVA] 해시를 사용한 집합과 맵 1764 듣보잡
2025. 1. 3. 16:26ㆍCoding Test/백준
나의 답) 300ms
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
HashMap<String, Integer> map = new HashMap<>();
for (int i = 0; i < n; i++) {
String name = br.readLine();
map.put(name, map.getOrDefault(name, 0) + 1);
}
for (int i = 0; i < m; i++) {
String name = br.readLine();
map.put(name, map.getOrDefault(name, 0) + 1);
}
List<String> res = new ArrayList<>();
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue() >= 2) res.add(entry.getKey());
}
Collections.sort(res);
sb.append(res.size()).append("\n");
for (String name : res) {
sb.append(name).append("\n");
}
System.out.print(sb);
}
}
[코드 설명]
1. HashMap으로 등장 횟수 세기
- map.put(name, map.getOrDefault(name, 0) + 1)를 통해 이름의 등장 횟수를 세었다.
- "듣도 못한 사람"과 "보도 못한 사람"을 동일한 방식으로 처리해 간결성을 유지했다.
2. 등장 횟수가 2 이상인 경우 필터링
- map.entrySet()을 순회하면서 등장 횟수가 2 이상인 이름만 결과 리스트에 추가했다.
3. 사전순 정렬
- Collections.sort()를 사용해 결과 리스트를 사전순으로 정렬했다.
[시간 복잡도 분석]
1. 입력 처리 및 등장 횟수 계산
- 듣도 못한 사람: O(N)
- 보도 못한 사람: O(M)
2. 결과 필터링
- map.entrySet() 순회: O(U) (U는 map에 저장된 고유 이름 수)
3. 사전순 정렬
- O(K log K) (K는 듣보잡의 수)
4. 최종 시간 복잡도
- O(N + M + U + K log K)
'Coding Test > 백준' 카테고리의 다른 글
[백준/JAVA] 백트래킹 15649 N과 M(1) (2) | 2025.01.04 |
---|---|
[백준/JAVA] 해시를 사용한 집합과 맵 10815 숫자 카드 (0) | 2025.01.04 |
[백준/JAVA] 해시를 사용한 집합과 맵 10816 숫자 카드 2 (0) | 2025.01.03 |
[백준/JAVA] 해시를 사용한 집합과 맵 1920 수 찾기 (0) | 2025.01.03 |
[JAVA] 백준 9단계 약수, 배수와 소수 (0) | 2024.11.30 |