N(1 ≤ N ≤ 1,000,000), M(1 ≤ M ≤ 1,000,000) 으로, 반복문을 사용해 단순 탐색을 할 경우 시간 복잡도는 O(N * M)이 된다.
여기에 testCase까지 더한다면, 시간 복잡도는 더 증가할 것이다.
따라서 이분 탐색이나 Set을 활용해 풀이해야 한다. 이분 탐색의 시간 복잡도는 O(Mlog N)이다.
참고 : https://hxxyeoniii.tistory.com/55
이진 탐색(binary search)
이진 탐색데이터가 정렬되어 있는 상태에서 원하는 값을 찾아내는 알고리즘대상 데이터의 중앙값과 찾고자 하는 값을 비교해 데이터의 크기를 절반씩 줄이며 대상을 찾음 * 시간복잡도 : O(logN)
hxxyeoniii.tistory.com
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
int testCase = Integer.parseInt(br.readLine());
for(int i=0; i<testCase; i++) {
// 수첩 1
int N = Integer.parseInt(br.readLine());
List<Integer> note1 = new ArrayList<>();
st = new StringTokenizer(br.readLine());
for(int j=0; j<N; j++) {
note1.add(Integer.parseInt(st.nextToken()));
}
// 수첩 2
int M = Integer.parseInt(br.readLine());
List<Integer> note2 = new ArrayList<>();
st = new StringTokenizer(br.readLine());
for(int k=0; k<M; k++) {
note2.add(Integer.parseInt(st.nextToken()));
}
Collections.sort(note1);
for(int l=0; l<M; l++) {
if(BinarySearch(note1, note2.get(l))) {
sb.append("1").append("\n");
} else {
sb.append("0").append("\n");
}
}
}
System.out.println(sb.toString());
}
private static boolean BinarySearch(List<Integer> list, int target) {
boolean flag = false;
int left = 0;
int right = list.size() - 1;
while(left <= right) {
int mid = (left+right) / 2;
if(list.get(mid) == target) {
return true;
}
if(list.get(mid) > target) {
right = mid - 1;
} else if(list.get(mid) < target) {
left = mid + 1;
}
}
return flag;
}
}
'알고리즘' 카테고리의 다른 글
| [백준] 온라인 저지 1654번 : 랜선 자르기(Java), 이분 탐색 (0) | 2025.03.20 |
|---|---|
| 그래프 : 벨만 포드 (0) | 2025.03.19 |
| 동적계획법(Dynamic Programming) (0) | 2024.12.11 |
| 그래프 : 다익스트라 (0) | 2024.12.11 |
| 위상 정렬(topology sort) (5) | 2024.11.28 |