Baekjoon/Silver
C++ / 백준 / 10815 / 숫자 카드
GitHubSeob
2021. 8. 17. 01:16
문제
https://www.acmicpc.net/problem/10815
10815번: 숫자 카드
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,
www.acmicpc.net
문제풀이
상근이가 가지고 있는 카드 card, 가지고 있는지 확인하는 check 벡터 두 개를 이용한다.
확인하는 카드 수만큼 반복하면서 이분 탐색을 한다.
상근이의 카드들을 정렬시켜야 이분 탐색이 가능하다.
확인 카드를 들고 상근이의 카드 목록을 보면서 이 카드가 있는지를 확인한다.
low와 high를 가지고 가운데인 mid값을 도출하면서
상근이의 카드[mid] < 확인카드이면 low를 mid+1로 변경한다.
상근이의 카드 > 확인카드 high를 mid-1로 변경한다.
확인카드가 더 작은 경우
확인카드가 더 큰 경우
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int N = 0, M = 0;
int i = 0;
cin >> N;
vector<int>card(N, 0);
for (i = 0; i < N; ++i)
cin >> card[i];
sort(card.begin(), card.end());
cin >> M;
vector<int>check(M, 0);
vector<int>answer(M, 0);
for (i = 0; i < M; ++i) {
cin >> check[i];
int low = 0;
int high = N - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (card[mid] == check[i]) {
answer[i]++;
break;
}
else if (card[mid] < check[i])
low = mid + 1;
else if (card[mid] > check[i])
high = mid - 1;
}
}
for (i = 0; i < M; ++i)
cout << answer[i] << " ";
}