🖥️ CS/Baekjoon Algorithms

#1946번 신입 사원 (C++)

한국의 메타몽 2020. 11. 1. 17:55

링크 : www.acmicpc.net/problem/1946

 

1946번: 신입 사원

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

www.acmicpc.net

처음에 문제를 주의깊게 읽지않아 해석을 잘못했다. 

입력되는 값들은 '점수'가 아니라, '순위'이다. 즉, 숫자가 적을수록 유리한 입지에 있다는 뜻이다.

문제를 잘못해석한 탓에 몇 차례 실수를 겪었다. 

 

문제를 푼 방법은 다음과 같다. 

 

(1) 오름차순으로 나열한다. 이렇게해서 서류심사는 정렬이 되었으므로, 이제 면접심사(두 번째 값)만 비교하면 된다.  

(2) v[0]에 위치한 사람은 무조건 합격이므로, 정답값은 1부터 시작한다.

(3) v[1]부터 마지막사람까지 비교를 시작한다. 

이때 가장 높은 순위(즉, 가장 작은 면접심사의 결과값을 가진 사람)와 비교해서 해당 위치의 면접심사값보다 작으면 정답값을 상승시킨다.

 

3번의 과정을 위해, 비교값이 바뀔때마다 제일 높은 등수와 누가 더 숫자가 작은지 비교하는 if문을 세웠다.

 

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

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

	int n = 0, temp = 0, a = 0, b = 0, ans = 1, big_num=0;
	vector<pair<int,int>> v;
	cin >> n;
	while(n>0){
		n--;
		cin >> temp;
		for(int i=0; i<temp; i++){
			cin >> a >> b;
			v.push_back(make_pair(a,b));
		}
		sort(v.begin(), v.end());
		big_num = v[0].second;
		for(int i=1; i<temp; i++){
			if(v[i].second<big_num)ans++;
			if(v[i].second<big_num) big_num = v[i].second;
		}
		cout << ans << "\n";
		v.clear();
		ans = 1;
	}
	return 0;
}

처음에는 문제해석을 잘못해서 무조건 앞 사람과 점수를 비교하다 틀렸고,

그 다음에는 이중 for문으로 접근했다가 시간초과가 나서 틀렸다. 

'🖥️ CS > Baekjoon Algorithms' 카테고리의 다른 글

#3036번 링 (C++)  (0) 2020.11.03
#2609번 최대공약수와 최대공배수 (C++)  (0) 2020.11.02
#11399번 ATM (C++)  (0) 2020.10.30
#1931번 회의실배정 (C++)  (0) 2020.10.30
#11047번 동전 0 (C++)  (0) 2020.10.28