https://www.acmicpc.net/problem/1946



문제를 보면 서류와 면접 점수의 등수가 순서대로 주어졌다고 나와있다.

등수를 점수로 착각해서 조금 헤맸는데 항상 문제를 먼저 잘 봐야 한다고 느낀다.


그리디 문제로 이를 어떻게 해결할지 고민하다가

생각보다 간단하게 해결할 수 있었다.


동일한 등수가 없기 때문에

서류 또는 면접을 기준으로 등수대로 정렬을 하면 된다.


예를들어

문제의 보기 처럼 5명의 서류와 면접 등수를 각각 살펴보면 아래와 같다.


3 2

1 4

4 1

2 3

5 5




이를 서류 등수 순서대로 정렬 하면 아래와 같다.


1 4

2 3

3 2

4 1

5 5



여기서 중요한 점은

서류 또는 면접 등수 중에 하나라도 우위가 있으면 되기 때문에

A가 B보다 서류 등수가 낮을 때 B가 A의 면접 등수보다 높으면 된다.


1 4를 먼저 포함하고

다음으로 2 3을 포함하려고 했더니

서류 등수가 낮은데 면접 등수가 더 높아서 포함 할 수 있다.


다음으로 3,2를 포함하려고 했더니

서류 등수가 낮은데 면접 등수가 더 높아서 포함 할 수 있다.


이를 반복하다가

마지막 5,5의 경우에는 서류와 면접 등수가 모두 낮기 때문에 포함시킬 수 없게 되서 4명의 신입 사원이 선발된다.



결론적으로는

서류 등수를 기준으로 정렬을 한다음에

면접 등수를 내림 차순으로 뽑을 때의 길이를 구하면 되는 문제이다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
 
int main(){
    
    int T;
    cin>>T;
    
    int n;
    for(int testCase=0;testCase<T;testCase++){
        cin>>n;
        vector<vector<int>> score(n,vector<int>(2,0));
        for(int i=0;i<n;i++){
            scanf("%d %d",&score[i][0],&score[i][1]); //서류,면접 등수
        }
        
        int ans=0;
        sort(score.begin(),score.end());
        
        vector<int> select;
        select.push_back(score[0][1]);
        
        for(int i=1;i<n;i++){
            if(select[ans]>score[i][1]){
                select.push_back(score[i][1]);
                ans++;
            }
        }
        printf("%d\n",ans+1);
    }
    
    return 0;
}
 
cs




'알고리즘(BOJ) > 그리디' 카테고리의 다른 글

백준 1969번 - DNA  (0) 2019.06.08
백준 1120번 - 문자열  (0) 2018.04.03
백준 9372번 - 상근이의 여행  (0) 2018.03.16
백준 1922번 - 네트워크 연결  (0) 2018.03.16
백준 1049번 - 기타줄  (0) 2018.02.03

+ Recent posts