Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- Doubly Connected Edge List
- 보로노이다이어그램
- SOH
- dp
- uclidean algorithm
- 다이나믹 프로그래밍
- Expanding Polytope Algorithm
- AABB
- c#
- linux
- 충돌 알고리즘
- GJK
- 백준
- ubuntu
- 수학
- PS
- 내적
- Unity
- 분할축 이론
- 우분투
- 알고리즘
- 유니티
- 벡터
- C++
- 리눅스
- 외적
- 문제풀이
- Graham Scan
- C
- Vector
Archives
- Today
- Total
마이 플밍 블로그
백준 10816 - 숫자카드2 본문
수정 전
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N, M;
vector<int> arr;
vector<int> keys;
int test(int low, int height, int key) {
int mid = (low + height) / 2;
if (arr[mid] == key) {
int index = mid;
int count = 1;
while (!(index <= 0 || index == arr.size() - 1)) {
index--;
if (arr[index] == key)
count++;
else {
break;
}
}
index = mid;
while (!(index <= 0 || index == arr.size() -1)) {
index++;
if (arr[index] == key)
count++;
else {
break;
}
}
return count;
}
if (mid == low || mid == height)
return 0;
if (arr[mid] > key) {
return test(low, mid, key);
}
if (arr[mid] < key) {
return test(mid, height, key);
}
}
int main() {
scanf("%d", &N);
for (int i = 0; i < N; i++) {
int key;
scanf("%d", &key);
arr.push_back(key);
}
sort(arr.begin(), arr.end());
cin >> M;
for (int i = 0; i < M; i++) {
int key;
scanf("%d", &key);
keys.push_back(key);
}
for (int i = 0; i < keys.size(); i++) {
printf("%d ", test(0, keys.size(), keys[i]));
}
return 0;
}
수정 후
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N, M;
vector<int> arr;
vector<int> keys;
int LowerBinary(int key) {
int mid, start, end;
start = 0;
end = arr.size() - 1;
while (end > start) {
mid = (start + end) / 2;
// key가 시작하는 곳 찾기
// 배열이 key보다 크거나 같을경우 end 범위 줄이기
if (arr[mid] >= key) {
end = mid;
}
else {
// start = mid 로하면 안끝남
start = mid + 1;
}
}
return end;
}
int UpperBinary(int key) {
int mid, start, end;
start = 0;
end = arr.size() - 1;
while (end > start) {
mid = (start + end) / 2;
// key의 끝부분 찾기
// 배열 값이 key 값보다 큰 곳으로 가기
if (arr[mid] > key) {
end = mid;
}
else {
// start = mid 로하면 안끝남
start = mid + 1;
}
}
return end;
}
int main() {
scanf("%d", &N);
for (int i = 0; i < N; i++) {
int key;
scanf("%d", &key);
arr.push_back(key);
}
sort(arr.begin(), arr.end());
cin >> M;
for (int i = 0; i < M; i++) {
int key;
scanf("%d", &key);
keys.push_back(key);
}
for (int i = 0; i < keys.size(); i++) {
int lower = LowerBinary(keys[i]);
int upper = UpperBinary(keys[i]);
if (upper == arr.size() - 1 && arr[arr.size() - 1] == keys[i])
upper++;
printf("%d ", upper - lower);
}
return 0;
}
'문제풀이 > 백준' 카테고리의 다른 글
백준 16953 - A -> B (0) | 2021.10.10 |
---|---|
백준 2110 - 공유기 설치 (0) | 2021.10.10 |
백준 1992 - 쿼드트리 (0) | 2021.10.09 |
백준 1914 - 하노이탑 (0) | 2021.10.06 |
백준 2178 미로찾기 (0) | 2021.07.02 |