해당 문제는 백준 사이트에서 풀 수 있습니다.
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;
}
'코딩테스트 > 백준' 카테고리의 다른 글
백준 2447] C++ 별 찍기 - 10 (0) | 2020.11.22 |
---|---|
백준 2630] C++ 색종이 만들기 (0) | 2020.11.17 |
백준 11053] C++ 가장 긴 증가하는 부분 순열 (0) | 2020.11.13 |
백준 2941] C++ 그룹 단어 체커 (0) | 2020.11.12 |
백준 2941] C++ 크로아티아 알파벳 (0) | 2020.11.12 |
댓글