본문 바로가기
코딩테스트/백준

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

by Hwan2 2020. 11. 14.
728x90
반응형

 

 

 

 

 

 

 

해당 문제는 백준 사이트에서 풀 수 있습니다.

 

www.acmicpc.net/problem/10816

 

 

1. 문제

숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 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개의 수에 대해서,

각 수가 적힌 숫자 카드를 상근이가 몇 개 가지고 있는지를 공백으로 구분해 출력한다.

 

예제 입력 1                      예제 출력 1

10                                              3 0 0 1 2 0 0 2

6 3 2 10 10 10 -10 -10 7 3

8

10 9 -5 2 3 4 5 -10

 

2. 조건

1. 첫번째 입력받은 숫자들을 기준으로 한다.

2. 두번째 입력받은 숫자들을 가지고 첫번째에 같은 숫자가 몇개가 있는지 순서대로 적어놓는다.

 

 

3. 풀이

C++의 upper_bound와 lower_bound를 이용하면 쉽게 풀 수 있습니다.

 

우선 첫번째 입력받은 숫자들을 std::srot()를 이용하여 정렬해줍니다.

 

그 후 uppoer_bound를 해주게 되면 아분탐색으로 해당 숫자가 끝나는 위치를 반환하게 됩니다.

반대로 lower_bound는 이분탐색으로 해당 숫자가 시작되는 위치를 반환하게 됩니다.

 

그림을 통해 설명하자면.....

따라서 upper_bound의 위치와 lower_bound의 위치를 빼주면 해당 숫자에 갯수를 알 수 있습니다.

4. 코드

#include <iostream>
#include <vector>
#include <algorithm>

#pragma warning(disable: 4996)

using namespace std;

int main() {
    int T;
    int N, M, K, H;
    int X, Y;
    //int answer = 0;
    
    cin >> T;
    vector<int> v(T);

    for (int i = 0; i < T; i++)
        scanf("%d", &v[i]);
    
    sort(v.begin(), v.end());
    cin >> T;

    vector<int> answer(T);
    for (int i = 0; i < T; i++) {
        cin >> K;
        auto upper = upper_bound(v.begin(), v.end(), K);
        auto lower = lower_bound(v.begin(), v.end(), K);

        answer[i] = upper - lower;
    }

    for (auto n : answer)
        cout << n << " ";
        
    return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

댓글


스킨편집 -> html 편집에서