๐ ์ ์ถ ์ฝ๋
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
String[] s1 = br.readLine().split(" ");
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(s1[i]);
}
Arrays.sort(arr);
int M = Integer.parseInt(br.readLine());
String[] s2 = br.readLine().split(" ");
for (int i = 0; i < M; i++) {
bw.write(binarySearch(arr, Integer.parseInt(s2[i])) + "\n");
}
br.close();
bw.flush();
bw.close();
}
public static int binarySearch(int[] arr, int target) {
int low = 0;
int high = arr.length - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (arr[mid] == target) {
return 1;
}
if (arr[mid] < target) {
low = mid + 1;
}
if (arr[mid] > target) {
high = mid - 1;
}
}
return 0;
}
}
โ ํ์ด ๊ณผ์
๋ฌธ์ ์ ์ ํ ์ฌํญ๊ณผ ์๊ฐ ๋ณต์ก๋๋ฅผ ๋ถ์ํด๋ณด์๋ค.
์ ํ ์๊ฐ 1์ด
N(1 ≤ N ≤ 100,000)
M(1 ≤ M ≤ 100,000)
๋ชจ๋ ์ ์์ ๋ฒ์๋ -$2^31$ ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ $2^31$๋ณด๋ค ์๋ค.
- $n = 100,000$, ์ ํ ์๊ฐ์ 1์ด๋ก ์ปดํจํฐ๊ฐ 1์ด์ 1์ต๋ฒ ์ฐ์ฐํ๋ค ๊ฐ์ ํ๊ณ ๊ณ์ฐ์ ํด๋ณด์๋ค.
- $O(1)$์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ ์๊ณ ๋ฆฌ์ฆ์ ํญ์ ์ผ์ ํ ์๊ฐ ์ฐ์ฐ ํ์๋ฅผ ์ํํ๋ค
- $O(log n)$ ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ ์๊ณ ๋ฆฌ์ฆ์ ์ต์ ์ ๊ฒฝ์ฐ 17๋ฒ ์ดํ์ ์ฐ์ฐ์ ์ํํ๋ค.
- $O(n)$ ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ ์๊ณ ๋ฆฌ์ฆ์ ์ต์ ์ ๊ฒฝ์ฐ 100,000๋ฒ์ ์ฐ์ฐ์ ์ํํ๋ค.
- $O(n log n)$ ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ ์๊ณ ๋ฆฌ์ฆ์ ์ต์ ์ ๊ฒฝ์ฐ 1,660,000๋ฒ์ ์ฐ์ฐ์ ์ํํ๋ค.
- $O(n^2)$์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ ์๊ณ ๋ฆฌ์ฆ์ ์ต์ ์ ๊ฒฝ์ฐ 10,000,000,000 ๋ฒ์ ์ฐ์ฐ์ ์ํํ๋ค.
- ์ ํ ์๊ฐ์ด 1์ด ์ด๋ฏ๋ก $O(n^2)$์ ์ด์์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ ์๊ณ ๋ฆฌ์ฆ ์ ์ฌ์ฉํ ์ ์๋ค.
์ ์ถ ์ฝ๋ ์๊ฐ ๋ณต์ก๋
- for (int i = 0; i < N; i++) :
- ์ด ๋ฃจํ๋ 0๋ถํฐ N๋ณด๋ค ์์ ๋๊น์ง ๋ฐ๋ณต๋ฉ๋๋ค. ์ฆ, N๋ฒ ๋ฐ๋ณต๋๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๋ O(N)์ด๋ค.
- arrays.sort() :
- Arrays.sort()๋ ๋ฐฐ์ด์ ์ ๋ ฌํ๋ ๋ฉ์๋์ด๋ค.
- ์ต์ ์ ๊ฒฝ์ฐ: ํต์ํธ์ ๊ฒฝ์ฐ ํผ๋ฒ ์ ํ์ด ๋์๊ฑฐ๋ ํน์ ์ํฉ์์๋ $O(N^2)$ ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง ์ ์๋ค.
- ํ๊ท ์ ์ธ ๊ฒฝ์ฐ: Dual-Pivot Quicksort์ ํ๊ท ์ ์ธ ์ฑ๋ฅ์ $O(N log N)$ ์ด๋ค.
- ๋ฐ๋ผ์ Arrays.sort()์ ์๊ฐ ๋ณต์ก๋๋ ํ๊ท ์ ์ธ ๊ฒฝ์ฐ $O(N log N)$์ผ๋ก ํํํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ฉฐ, ์ต์ ์ ๊ฒฝ์ฐ $O(N^2)$ ๋ก ํํํ ์ ์๋ค.
- for (int i = 0; i < M; i++) :
- ์ด ๋ฃจํ๋ 0๋ถํฐ M๋ณด๋ค ์์ ๋๊น์ง ๋ฐ๋ณต๋๋ค. ์ฆ, M๋ฒ ๋ฐ๋ณต๋๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๋ O(M)์ด๋ค.
- binarySearch :
- ์ด๋ถ ํ์์ ๊ตฌํํ ๋ฉ์๋๋ก, ๋งค๋ฒ ํ์ ๊ตฌ๊ฐ์ด ์ ๋ฐ์ผ๋ก ์ค์ด๋ ๋ค.
- ๋ฐ๋ผ์ ์๊ฐ ๋ณต์ก๋๋ $O(log N)$ ์ ๋๋ค (์ฌ๊ธฐ์ N์ ๋ฐฐ์ด์ ํฌ๊ธฐ).
์ ์ฒด์ ์ผ๋ก ์ฝ๋์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๋ถ์ํด๋ณด๋ฉด
- ๋ฐฐ์ด ์
๋ ฅ ๋ฐ ์ ๋ ฌ:
- ๋ฐฐ์ด์ ์ ๋ ฅ๋ฐ๊ณ ์ ๋ ฌํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ O(N log N)์ด๋ค.
- ์ฟผ๋ฆฌ ์ฒ๋ฆฌ:
- ๊ฐ ์ฟผ๋ฆฌ์ ๋ํด ์ด๋ถ ํ์์ ์ํํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ O(M log N)์ด๋ค.
์ต์ข ์๊ฐ ๋ณต์ก๋
์ ์ฒด์ ์ผ๋ก, ์๊ฐ ๋ณต์ก๋๋ ๋ ๋ถ๋ถ์ ํฉ์ด๋ค:
$O(N+M)log N)$
'PS > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค | 10815] ์ซ์ ์นด๋ - Java (0) | 2024.08.08 |
---|---|
[๋ฐฑ์ค | 2750] ์ ์ ๋ ฌํ๊ธฐ - Java (0) | 2024.08.07 |
[๋ฐฑ์ค | ์๊ฐ๋ณต์ก๋] ์๊ณ ๋ฆฌ์ฆ ์์ - ์๊ณ ๋ฆฌ์ฆ์ ์ํ ์๊ฐ 5 (0) | 2024.08.07 |
[๋ฐฑ์ค | ์๊ฐ๋ณต์ก๋] ์๊ณ ๋ฆฌ์ฆ ์์ - ์๊ณ ๋ฆฌ์ฆ์ ์ํ ์๊ฐ 4 (0) | 2024.08.06 |
[๋ฐฑ์ค | ์๊ฐ๋ณต์ก๋] ์๊ณ ๋ฆฌ์ฆ ์์ - ์๊ณ ๋ฆฌ์ฆ์ ์ํ ์๊ฐ 3 (1) | 2024.08.06 |