본문 바로가기
백준

[백준 10816] 숫자 카드 2, C++

by 황인태(intaehwang) 2020. 2. 5.
반응형

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

 

10816번: 숫자 카드 2

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

www.acmicpc.net

 본 문제는 n개의 숫자 카드를 보유하고 있을 때, 해당 숫자가 적혀있는 숫자 카드의 개수를 m번 출력하는 문제다. 이분 탐색을 이용하는 문제로 개수를 구하는 문제는 lower_bound와 upper_bound로 구할 수 있다.

  • lower_bound : 크거나 같은 수 중 첫 번째
  • upper_bound : 큰 수 중 첫 번째

이러한 특징을 가지고 있기 때문에 upper_bound에서 lower_bound를 빼면 동일한 숫자의 개수가 나온다.

C++에는 lower_bound와 upper_bound를 반환해주는 equal_range 함수가 있다. 동일한 결과가 나오지만 equal_range가 조금 더 빠르다.

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
#include <cstdio>
#include <algorithm>
#include <vector>
 
using namespace std;
 
int main() {
    int n, m;
    scanf("%d"&n);
    vector<int> v;
    for (int i = 0; i < n; i++) {
        int tmp;
        scanf("%d"&tmp);
        v.push_back(tmp);
    }
    sort(v.begin(), v.end());
    vector<int> ans;
    scanf("%d"&m);
    for (int i = 0; i < m; i++) {
        int num;
        scanf("%d"&num);
        auto upper = upper_bound(v.begin(), v.end(), num);
        auto lower = lower_bound(v.begin(), v.end(), num);
        ans.push_back(upper-lower);
        // auto range = equal_range(v.begin(), v.end(), num);
        // ans.push_back(range.second - range.first);
    }
    for (int i = 0; i < ans.size(); i++) {
        printf("%d ", ans[i]);
    }
    printf("\n");
cs
반응형

'백준' 카테고리의 다른 글

[백준 1790] 수 이어 쓰기 2, C++  (0) 2020.02.05
[백준 11728] 배열 합치기, C++  (0) 2020.02.05
[백준 17089] 세 친구, C++  (0) 2020.02.04
[백준 17088] 등차수열 변환, C++  (0) 2020.02.02
[백준 16932] 모양 만들기, C++  (0) 2020.01.31
Buy me a coffeeBuy me a coffee

댓글