간단해 보이지만 이 문제는 ArrayList의 contains() 메서드로 풀면 시간 초과가 난다.
HashSet이나 Map을 이용해서 풀면 풀린다.
왜일까?
자료구조 | 시간복잡도 | 메서드 구현 방식 |
HashSet의 contains() | O(1) | Hashmap을 기반으로 구현 |
ArrayList의 contains() | O(n) | indexOf()를 사용해서 contain여부를 결정 |
HashSet은 HashMap 기반으로 구현되어 있어서 contains 메서드를 실행할때 HashMap.contains() 메서드를 불러온다.
그러므로 시간복잡도는 O(1) 이다.
AllayList의 indexOf는 배열에 있는 항목의 수에 따라 시간복잡도가 결정되므로 O(n)이다.
⭐따라서 ArrayList를 사용해서 시간초과가 나거나, 효율성이 필요한 문제라면 HashSet을 사용하는 것이 좋다.⭐
https://www.baeldung.com/java-hashset-arraylist-contains-performance
문제 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Baek_1764 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
ArrayList<String> 듣보잡 = new ArrayList<>();
StringBuilder sb = new StringBuilder();
HashSet<String> 듣도못한사람 = new HashSet<>();
for (int i = 0; i < N; i++) {
듣도못한사람.add(br.readLine());
}
for (int i = 0; i < M; i++) {
String 보도못한사람 = br.readLine();
if (듣도못한사람.contains(보도못한사람)) {
듣보잡.add(보도못한사람);
}
}
Collections.sort(듣보잡);
sb.append(듣보잡.size()).append('\n');
for (int i = 0; i < 듣보잡.size(); i++) {
sb.append(듣보잡.get(i)).append('\n');
}
System.out.println(sb);
}
}
추가적으로 다음 포스팅에 컬렉션별로 시간 복잡도를 정리해 보았다.
'Algorithm' 카테고리의 다른 글
백준 11723 (2) | 2024.03.20 |
---|---|
[백준 1654] 이진탐색 (1) | 2024.03.05 |
백준7576 토마토 (0) | 2023.06.11 |
백준 1041 주사위 (2) | 2023.05.04 |
백준 1663 -XYZ 문자열 (0) | 2023.05.03 |