정렬 쉽게 하기 위해서 벡터를 사용했다.
방문 여부?를 표기할 벡터 visitedA와 visitedB는 N 사이즈로 resize해주되, 0으로 초기화해준다.
A와 B 두 가지 벡터를 만들어주고,
A는 오름차순, B는 내림차순으로 정렬해준다.
A 기준으로, 작은 수부터 검사하는데, B 중에 A보다 작은 수가 있는 순간 +2점을 해준다.
이 때, A선수, B선수 둘이 대결을 했기에, 방문 여부 체크해준다.
승리했을 경우를 모두 본 후,
무승부인 경우도 확인하는데, 이미 대결한 A선수, B선수를 제외하고 봐야하므로 방문 여부 체크하는 것 잊지 말기.
코드는 다음과 같다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N;
vector<int> dpA;
vector<int> dpB;
vector<int> visitedA;
vector<int> visitedB;
int ans = 0;
void input(){
cin >> N;
int tmp;
for(int i=0; i<N; i++){
cin >> tmp;
dpA.push_back(tmp);
}
for(int i=0; i< N; i++){
cin >> tmp;
dpB.push_back(tmp);
}
visitedB.resize(N, 0); //0은 not visited
visitedA.resize(N, 0);
}
void solve(){
//A 리스트기준 작은 것부터 오름차순으로
//B 리스트 기준 큰 것부터 내림차순으로 확인.
sort(dpA.begin(), dpA.end());
sort(dpB.begin(), dpB.end(), greater<int>());
// A가 이기는 경우 먼저 보기
for(int i = 0 ; i < N; i++){
for(int j = 0; j<N; j++){
if(!visitedB[j]){
//j번째 B값이 방문하지 않았다면 확인, 방문했다면 넘겨야지
if(dpA[i] > dpB[j]){
ans += 2;
visitedB[j] = 1;
visitedA[i] = 1;
break;
}
}
}
}
// 비기는 경우?
for(int i = 0; i<N; i++){
if(visitedA[i]){
continue;
}
for(int j = 0; j< N; j++){
if(!visitedB[j]){
if(dpA[i] == dpB[j]){
ans += 1;
visitedB[j] = 1;
visitedA[i] = 1;
break;
}
}
}
}
}
void output(){
cout << ans;
}
int main() {
input();
solve();
output();
return 0;
}