백준 1489 대결 c++

치즈·2022년 9월 26일

BOJ

목록 보기
1/45

정렬 쉽게 하기 위해서 벡터를 사용했다.
방문 여부?를 표기할 벡터 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;
}
profile
차근차근 배워나가요

0개의 댓글