본문 바로가기

백준

[백준/c++] BOJ 1946 - 신입사원

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

 

1946번: 신입 사원

첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성

www.acmicpc.net

 

문제 설명

주식회사의 지원자는 서류 심사와 면접 시험을 본다. 서류 심사의 순위면접 시험의 순위가 주어질 때, 어떤 하나가 다른 지원자보다 떨어지지 않는 자만 선발한다. 즉, 두 심사의 순위가 지원자보다 더 높은 사람이 있을 경우, 해당 지원자는 탈락한다. 각 테스트 케이스에 대해서 주식회사가 선발할 수 있는 신입사원의 최대 인원수를 한 줄에 하나씩 출력한다.

 

첫째 줄에 테스트 케이스의 개수 T(1 <= T <= 20)가 주어지며, 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 <= N <= 100,000)이 주어진다. 성적의 순위는 1위부터 N위까지 동석차 없이 결정된다.

 

해결

두 성적은 pair로 vector에 받아 주었다. vector의 원소로 pair가 있을 경우, sort하게 되면 pair의 첫번째 원소를 기준으로 정렬된다. 즉, 정렬 후 벡터의 idx = 0 원소는 서류 심사의 1등이 된다.

 

서류 심사의 1등은 다른 누구랑 비교해도 서류 심사의 성적에서 이기므로, 떨어질 수 없는 사람이다.

또한, 그 뒤의 사람들은 서류 심사 1등과 비교했을 때 면접 시험의 순위도 낮다면, 선발에 떨어질 수 있다.

 

따라서 서류 심사의 2등부터 N등까지 기준 사람(처음엔 서류 심사의 1등)과 순서대로 비교하면서 면접 성적이 더 안 좋은 사람은 탈락하고, 더 좋은 사람은 합격시키며 기준 사람을 갱신해 주었다.

 

코드

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;

int n, m;


int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> m;
		vector<pair<int, int>> v;
		int a, b, ans = 1;
		for (int j = 0; j < m; j++) {
			cin >> a >> b;
			v.push_back(make_pair(a, b));
		}
		sort(v.begin(), v.end());
		
		int idx = 0;

		for (int j = 1; j < m; j++) {
			if (v[idx].y > v[j].y) {
				ans++;
				idx = j;
			}
		}

		cout << ans << "\n";
	}
}

'백준' 카테고리의 다른 글

[백준/c++] BOJ 20310 - 타노스  (0) 2023.09.19
[백준/c++] BOJ 12886 - 돌 그룹  (0) 2023.09.19
[백준/c++] BOJ 14889 - 스타트와 링크  (1) 2023.09.02
[백준/c++] BOJ 13305 - 주유소  (0) 2023.07.13
[백준/c++] BOJ 1439 - 뒤집기  (0) 2023.07.13