[백준/BOJ] 백준 1946번 : 신입 사원

2021. 3. 25. 20:09알고리즘 문제풀이

www.acmicpc.net/problem/1946

 

1946번: 신입 사원

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

www.acmicpc.net

vector<pair<int, int>> score_rank 에 (서류 순위, 면접 순위)로 저장하고 정렬을 하여 앞에 사람이 서류 순위는 앞서도록 정렬을 한다. 그리고 정렬한 수들을 확인하여 지금까지 나온 가장 앞선 면접 순위를 저장하여 앞의 수 보다 서류 순위에서는 밀리지만 어떠한 앞에 수 보다 면접순위에서는 앞설 때를 확인하여 문제를 해결했다.

 

코드

#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>
using namespace std;

int t;
int n;
vector<pair<int, int>> score_rank;

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	cin >> t;

	for (int tc = 0; tc < t; tc++)
	{
		score_rank.clear();

		cin >> n;

		for (int i = 0; i < n; i++)
		{
			int a, b;
			cin >> a >> b;

			score_rank.push_back(make_pair(a, b));
		}

		//앞에 사람이 서류 순위는 앞서도록 정렬
		sort(score_rank.begin(), score_rank.end());

		int result = 0;
		int best_second = 987654321; //지금까지 나온 가장 앞선 면접 순위 저장
		for (int i = 0; i < score_rank.size(); i++)
		{
			//앞의 수 보다 서류 순위에서는 밀리지만 어떠한 앞에 수 보다 면접순위에서는 앞설때 
			if (best_second > score_rank[i].second)
			{
				best_second = score_rank[i].second;
				result++;
			}
		}

		cout << result << "\n";
	}

	return 0;
}