나의 브을로오그으

[c++] 10816번 : 숫자 카드2 본문

알고리즘/BaekJoon

[c++] 10816번 : 숫자 카드2

__jhp_+ 2022. 5. 5. 18:11

https://www.acmicpc.net/problem/10816

 

10816번: 숫자 카드 2

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int N, M, card[500000] = { 0, };
pair<int, int> counter[500000];

int findCardNumber(int num, int last)
{
	int low = 0;
	int high = last;
	int mid = 0;
	int cnt = 0;
	while (low <= high)
	{
		mid = low + (high - low) / 2;
		if (num < counter[mid].first)
		{
			high = mid - 1;
		}
		else if (num > counter[mid].first)
		{
			low = mid + 1;
		}
		else
		{
			cnt = counter[mid].second;
			break;
		}
	}

	return cnt;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	cin >> N;
	for (int i = 0; i < N; ++i)
	{
		cin >> card[i];
	}
	sort(card, card + N);
	bool bFlag = false;
	int cardIndex = 0;
	int index = 0;
	while (index < N)
	{
		if (bFlag == false)
		{
			bFlag = true;
			counter[cardIndex].first = card[index];
			counter[cardIndex].second = 1;
			++index;
		}
		else
		{
			if (counter[cardIndex].first == card[index])
			{
				++counter[cardIndex].second;
				++index;
			}
			else
			{
				++cardIndex;
				bFlag = false;
			}
		}
	}

	cin >> M;
	int num = 0;
	for (int i = 0; i < M; ++i)
	{
		cin >> num;
		cout << findCardNumber(num, cardIndex) << ' ';
	}


	return 0;
}

'알고리즘 > BaekJoon' 카테고리의 다른 글

[c++] 10845번 : 큐  (0) 2022.05.10
[c++] 10828번 : 스택  (0) 2022.05.08
[c++] 10814번 : 나이순 정렬  (0) 2022.05.05
[c++] 10773번 : 제로  (0) 2022.05.05
[c++] 10250번 : ACM 호텔  (0) 2022.05.04