💻STUDY/BOJ

[BOJ] 10816. 숫자 카드2 (C++)

coldNoodlePigeon 2022. 7. 23.
  • 코딩 초보

10816. 숫자 카드2 (실버 4) 

 

문제

숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오.

입력

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

셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 몇 개 가지고 있는 숫자 카드인지 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이 수도 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.

출력

첫째 줄에 입력으로 주어진 M개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 몇 개 가지고 있는지를 공백으로 구분해 출력한다.

 

 

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

int n, m; 

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

	cin >> n; 

	vector <int> v(n);
	

	for (int i = 0; i < n; i++) {
		cin >> v[i]; 
	}

	sort(v.begin(), v.end()); 

	cin >> m; 

	vector <int> v2(m);

	for (int i = 0; i < m; i++) {
		int num; 
		cin >> num; 

		cout << upper_bound(v.begin(), v.end(), num) - lower_bound(v.begin(), v.end(), num)<<" ";
	}

	
	return 0;
}

 

이분 탐색 문제이다. 여기서 upper_bound()와 lower_bound()를 처음으로 사용해봤다. 

upper_bound는 이진 탐색을 기반으로 하는 탐색 방법으로, 해당 원소(num)가 v.begin()부터 v.end()까지에서 찾으려는 원소보다 큰 값의 원소의 위치를 처음으로 return한다. lower_bound도 또한 마찬가지로, 해당 원소가 처음으로 나오는 위치를 찾아서 return해준다. 따라서 두 위치를 upper에서 lower로 빼주면 갯수가 나오는 것이다. 

 

upper_bound와 lower_bound가 이진탐색 기반의 탐색 메소드인 것을 처음 알았고, 이렇게 사용해보는 것도 처음이다. 이번에 꼭 익혀둬야겠다. 

'💻STUDY > BOJ' 카테고리의 다른 글

[BOJ] 1629. 곱셈 (C++) (분할정복)  (0) 2022.07.24
[BOJ] 11651. 좌표 정렬하기2 (C++)  (0) 2022.07.09
[BOJ] 15650. N과 M(2) (C++)  (0) 2022.07.08
[BOJ] 15649. N과 M (1) (C++)  (0) 2022.07.07
[BOJ] 2606. 바이러스 (C++)  (0) 2022.07.03

댓글