PS
백준 1946. 신입 사원
tose33
2021. 8. 6. 15:55
https://www.acmicpc.net/problem/1946
1946번: 신입 사원
첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성
www.acmicpc.net
1. pair에 두 등수를 저장하고 하나를 first를 기준으로 오름차순 정렬한다. (서류등수, 면접등수)
2. 서류1등의 면접등수를 최소 면접등수로 기억한다.
3. 서류등수를 기준으로 오름차순되어 있으므로 for문을 처음부터 돌면서 면접등수가 최소면접등수 보다 크면,
나보다 서류등수가 작고, 면접등수도 작은 사람이 있다는 뜻이므로 탈락이다.
4. 최소면접등수 보다 면접등수가 작으면 갱신한다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int testcase;
cin >> testcase;
while(testcase--)
{
int n;
cin >> n;
// 서류등수, 면접등수
vector<pair<int,int>> v;
for(int i = 0; i < n; i++)
{
int a,b;
cin >> a >> b;
v.push_back({a,b});
}
sort(v.begin(), v.end(), less<>());
int out = 0;
int minimum = v[0].second; // 서류1등의 면접등수
for(int i = 1; i < n; i++)
{
// 면접등수가 minimum보다 크다는것은, 나보다 면접,서류 모두 등수 낮은사람이 있음: 탈락
if(v[i].second > minimum)
{
out++;
}
else // 나보다 서류 등수는 높지만, 면접 등수는 낮은 사람이 있음 : 합격
{
minimum = v[i].second;
}
}
cout << n-out << '\n';
}
}