문제풀이/백준

백준 10816 - 숫자카드2

레옹 2021. 10. 10. 02:49

수정 전

#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;
}