Baekjoon Online Judge

백준 7568번) 덩치

judy1467 2023. 1. 9. 00:45

본문의 코드보다 더 효율적인 코드가 분명 존재합니다.

참고만 해주시면 감사하겠습니다.

코드 지적은 언제나 환영입니다.


풀이

케이스 갯수를 입력받고 갯수만큼 몸무게와 키를 입력받는다.

입력받은 케이스를 서로 비교하여 (자신보다 더 큰 케이스 갯수+1)의 숫자를 부여한다.

단, 비교하기가 애매한 경우(ex 몸무게1 > 몸무게2, 키1 < 키2) 같은 숫자를 부여한다.

 

vector(가변배열)에 pair<순서, pair<몸무게, 키>>를 입력한다.

2중 for문을 이용하여 vector의 첫 주소부터 마지막 주소까지 각 주소마다 모든 주소의 값들과 비교하며 자신보다 덩치가 큰 케이스를 카운트한다.

만약 제일 큰 경우라면 카운트가 0 이기 때문에 pair의 first 자리에 0+1을 입력한다.

만약 두번 째로 큰 경우라면 카운트가 1이기 때문에 pair의 first 자리에 1+1을 입력한다.

 

코드

#include "iostream"
#include "utility"
#include "queue"

using namespace std;

vector<pair<int, pair<int, int>>> list;

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int n;
    cin >> n; // 케이스 수 입력

    for(int i = 0 ; i < n ; i++){
        int tmp1, tmp2;
        cin >> tmp1 >> tmp2; // 몸무게, 키 입력
        list.push_back(make_pair(0, make_pair(tmp1, tmp2)));
    }

    for(auto i = list.begin() ; i != list.end() ; i++){
        int cnt = 0;
        for(auto j = list.begin() ; j != list.end() ; j++){
            if((*i).second.first < (*j).second.first){
                if((*i).second.second < (*j).second.second){
                    cnt++; // 몸무게, 키 둘다 자신보다 크다면 카운트
                }
            }
        }
        (*i).first = cnt+1; // 카운트+1 저장
    }

    for(auto i = list.begin() ; i != list.end() ; i++){
        cout << (*i).first << "\n";
    }

    return 0;
}