1946

백준 1946번

Link: 1946번: 신입 사원


문제 설명

오늘도 Greedy문제.

문제 이해하는데 시간이 좀 오래걸렸다.

이해하고 나서 풀어보려는데 처음에는 두 등수의 평균을 구한 다음 평균이 높은 절반끼리 비교하는 방식으로 구현했는데, 일단 시간초과가 났다.

방문 여부를 표시하고 조건에 안맞으면 반복문 중간에서 나가는 방식으로 보완했는데, 이렇게 푸니까 이젠 답이 틀리더라.

그 다음엔 각각의 등수가 1인 경우들은 반드시 포함시키고, 이 둘에 대해 비교하며 카운트를 늘려가는 방식으로 풀어봤는데, 역시 틀렸다.

한참 고민하며 반례 찾으러 질문게시판에 들어가봤는데, 반례 찾다가 다른사람의 아이디어를 보고 힌트를 얻어 풀 수 있었다.

핵심은 한가지 등수로 오름차순 정렬을 하는 것.

이렇게 하면 두가지 등수 중 한가지 등수만 비교하면 풀린다.

나머지 한 등수에 대해 정답에 포함시킨 바로 앞 등수보다 크면 포함시키지 않고, 반대의 경우 작은 등수로 바꿔주고 카운트를 하나 늘린 후 이를 반복하는 방식으로 풀 수 있었다.

아이디어를 짜내보려고 노력한 것까지는 좋았던 것 같으나 핵심을 찾는데에는 도달하지 못했다.

심지어 한가지 등수로 오름차순 정렬하는것까지는 했는데 그 다음을 생각해내지 못했다는 점이 아쉬웠다.


정답 코드

//
// Created by Keith_Lee on 19/02/2019.
//

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct candidates{
    int doc, interview;
};

bool compare(candidates &a, candidates &b){
    if(a.doc > b.doc){
        return false;
    }
    return true;
}

int main(){
    int T;

    cin >> T;

    for(int test=0; test<T; test++){
        int N;

        cin >> N;

        vector<candidates> applicants;

        for(int i=0; i<N; i++){
            int doc, interview;

            cin >> doc >> interview;

            applicants.push_back({doc, interview});
        }

        sort(applicants.begin(), applicants.end(), compare);

        int count = 1;

        int standard = applicants[0].interview;

        for(int i=1; i<applicants.size(); i++){
            if(standard > applicants[i].interview){
                standard = applicants[i].interview;
                count++;
            }
        }

        cout << count << '\n';
    }

    return 0;
}