일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 리트코드
- 알고리즘
- LeetCode
- 안드로이드
- 프로그래머스
- 자바
- Redux
- DP
- react
- network
- Graph
- git
- BFS
- DFS
- 그레이들
- VIM
- Python
- TypeScript
- frontend
- Javascript
- Algorithm
- 동적 계획법
- 다이나믹 프로그래밍
- Data Structure
- db
- CS
- Database
- vscode
- 백준
- java
Archives
- Today
- Total
늘 겸손하게
백준 10816 ( C++ ) 본문
숫자 카드 2
이분 탐색의 upper bound와 lower bound를 이용하여 푸는 문제이다.
upper bound 와 lower bound 란?
이분 탐색으로 배열에서 숫자를 탐색할 때 찾으려는 숫자의 개수가 배열에서 여러 개 존재할 수 있다.
이때 탐색된 동일한 숫자들중 가장 작은 인덱스 값이 lower bound, 가장 큰 인덱스 값이 upper bound이다.
예로 길이가 10이고 각 원소 값이 { 1 , 3, 5, 9 , 11 , 13 ,19 , 19 , 19 , 20 } 인 배열에서 19를 찾는다고 해보자.
19가 가장 처음 나온 인덱스는 6 , 가장 나중에 나온 인덱스는 8 이므로 lower bound는 6, upper bound는 8이 된다.
이를 이용하여 문제를 해결해야 시간 초과가 발생하지 않는다.
Lower bound와 Upper bound 찾는 코드
보통의 이분 탐색 (binary search ) 코드에서 살짝 변형만 해주면 된다.
lower bound를 찾는 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
int lower_binary(int* arr, int target, int size) {
int mid, start, end;
start = 0, end = size - 1;
while (start < end) {
mid = (start + end) / 2;
if (arr[mid] >= target)
end = mid;
else
start = mid + 1;
}
return end;
}
|
cs |
upper bound 를 찾는 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
|
int upper_binary(int* arr, int target, int size) {
int mid, start, end;
start = 0, end = size - 1;
while (start < end) {
mid = (start + end) / 2;
if (arr[mid] > target)
end = mid;
else
start = mid + 1;
}
return end;
}
|
cs |
그래서 정답은 upper bound - lower bound를 출력하면 된다.
단, 위 코드를 이용하면 upper bound와 lower bound 가 같은 경우, 예로 {3}인 배열에서 3을 찾는 경우에는 0을 출력해버리므로 예외처리를 해주어야 한다.
코드
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
|
#include <iostream>
#include <algorithm>
using namespace std;
int lower_binary(int* arr, int target, int size) {
int mid, start, end;
start = 0, end = size - 1;
while (start < end) {
mid = (start + end) / 2;
if (arr[mid] >= target)
end = mid;
else
start = mid + 1;
}
return end;
}
int upper_binary(int* arr, int target, int size) {
int mid, start, end;
start = 0, end = size - 1;
while (start < end) {
mid = (start + end) / 2;
if (arr[mid] > target)
end = mid;
else
start = mid + 1;
}
return end;
}
int main(void) {
int N;
cin >> N;
int* arr = (int*)malloc(sizeof(int) * N);
for (int i = 0; i < N; i++) {
cin >> arr[i];
}
sort(arr, arr + N);
int M;
cin >> M;
int* numToFind = (int*)malloc(sizeof(int) * M);
for (int i = 0; i < M; i++)
cin >> numToFind[i];
for (int i = 0; i < M; i++) {
int lower = lower_binary(arr, numToFind[i], N);
int upper = upper_binary(arr, numToFind[i], N);
if (upper == N - 1 && arr[N - 1] == numToFind[i])
upper++;
cout << upper - lower << " ";
}
free(arr);
free(numToFind);
}
|
cs |
결과
'코딩 문제 > 백준' 카테고리의 다른 글
백준 - 2110 ( Java ) - 매개변수 탐색 (0) | 2021.07.20 |
---|---|
백준 1654 ( C++ ) (0) | 2021.07.20 |
백준 1920 ( Java ) (0) | 2021.07.18 |
백준 11444 ( C++) (0) | 2021.07.17 |
백준 2740 ( C++ ) (0) | 2021.07.16 |