Study/Algorithm
BOJ (C/C++) 10815번: 숫자 카드
hwooo
2022. 10. 20. 03:50
https://www.acmicpc.net/problem/10815
10815번: 숫자 카드
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,
www.acmicpc.net

풀이
숫자 카드와 상근이가 가지고 있는 카드를 각각 크기 순으로 정렬, 투포인터로 값을 비교했다.알고리즘엔 이진 탐색이라 되어 있어 이진 탐색으로도 풀어볼 예정코드
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
vector <int> Card;
vector <pair<int, int>> Com;
int N, M;
bool cmp(pair<int, int> a, pair<int, int> b) { return a.second < b.second; }
bool ret(pair<int, int> a, pair<int, int> b) { return a.first < b.first; }
void Is_in(int size) {
int n1, n2;
n1 = n2 = 0;
while (n1 < N && n2 < M) {
if(n1>=N||n2>=M) break;
if (Card[n1] == Com[n2].second) {
Com[n2].second = 1;
n2++;
}
else if (Card[n1] > Com[n2].second) {
Com[n2].second = 0;
n2++;
}
else n1++;
}
if (n2 != M) {
for (int i = n2; i < M; i++) Com[i].second = 0;
}
}
int main() {
int c;
scanf("%d", &N); // num of disk
for (int i = 0; i < N; i++) {
scanf("%d", &c);
Card.push_back(c);
}
scanf("%d", &M);
for (int i = 0; i < M; i++) {
scanf("%d", &c);
Com.push_back({ i,c });
}
sort(Card.begin(), Card.end());
sort(Com.begin(), Com.end(), cmp);
Is_in(M);
sort(Com.begin(), Com.end(), ret);
for (int i = 0; i < Com.size(); i++) printf("%d ", Com[i].second);
return 0;
}