728x90
자세한 풀이
https://byungil.tistory.com/186
= 접근 방법 =
1. 단순 for문을 이용하면 시간 초과, 따라서 이분 탐색 알고리즘을 활용해서 시간 복잡도 O(logN)로 풀자.
2. 중복값이 허용되는 문제이기 때문에 내가 찾는 숫자의 최소 index와 최대 index를 구해서 개수를 확인하자.
예를 들면, 1 1 2 2 5 => index: 0 1 2 3 4
2라는 숫자를 찾아야 된다고 한다면 index:2, index:4 를 찾아서 4 - 2를 통해 2개가 있다는 것을 찾으면 해결!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// 1. input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine()); // 숫자카드 n개
int[] arr = new int[n]; // n개의 숫자카드를 담는 배열
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr); // 정렬은 필수
st = new StringTokenizer(br.readLine());
int m = Integer.parseInt(st.nextToken()); // m개의 숫자 카드
// 이 숫자에 적혀있는 카드가 배열에 몇 개 존재하는지 출력하는 문제.
// 범위가 매우 크기 때문에 이분 탐색을 이용해서 해결하자.
st = new StringTokenizer(br.readLine());
for (int i = 0; i < m; i++) {
int num = Integer.parseInt(st.nextToken());
int result = high(arr, num) - low(arr, num);
sb.append(result).append(" ");
}
System.out.println(sb);
}
public static int low(int[] arr, int num) {
int l = 0;
int r = arr.length;
int lo = 0;
while (l < r) {
int mid = (l + r) / 2;
if (arr[mid] == num) {
lo = mid;
r = mid;
} else if (arr[mid] < num) {
l = mid + 1;
} else if (arr[mid] > num) {
r = mid;
}
}
return lo;
}
public static int high(int[] arr, int num) {
int l = 0;
int r = arr.length;
int hi = 0;
while (l < r) {
int mid = (l + r) / 2;
if (arr[mid] == num) {
l = mid + 1;
hi = l;
} else if (arr[mid] < num) {
l = mid + 1;
} else if (arr[mid] > num) {
r = mid;
}
}
return hi;
}
}
|
cs |
728x90
'백준 오답노트 > 이분 탐색' 카테고리의 다른 글
백준 - 이분 탐색 1300번 K번째 수 / 풀이, 오답 (0) | 2023.01.19 |
---|---|
백준 - 이분 탐색 2110번 공유기 설치 / 풀이, 오답 (0) | 2023.01.17 |
백준 - 이분 탐색 2805번 나무 자르기 / 풀이, 오답 (0) | 2023.01.09 |
백준 - 이분 탐색 1654번 랜선 자르기 / 풀이,오답 (0) | 2023.01.09 |