신입사원의 채용 기준은 다른 모든 면접자들의 성적과 비교해서 하나라도 우수한 직원을 뽑는 것입니다.
문제의 뜻을 잘 이해하지 않으면 풀기 어려운 문제입니다.
성적은 두가지가 있는데, 이 두가지의 성적은 모두 동차 없이 순위가 정해집니다. N명의 면접자가 있다면, 1위부터 N위까지말이죠.
예를 들어서 3명의 면접자가 있고, 순위가 (1, 3) (2, 2) (3, 1) 이었다면, (1, 3)위 한 사람은 다른 두 직원에 비해서 첫번째 성적이 좋으므로 채용됩니다. (2, 2)한 면접자는 (1, 3) 면접자에 비해서는 두번째 시험성적이, (3, 1) 면접자에 비해서는 첫번째 시험성적이 좋아서 채용되죠. (3, 1) 면접자는 다른 두 면접자에 비해서 두번째 성적이 좋아서 채용됩니다.
이것을 저는 탐욕적 기법을 통해서 풀었습니다.
1) 첫번째 성적으로 정렬합니다.
2) 두번째 성적의 최소값을 N+1로 설정합니다.
3) 정렬된 모든 원소에 대해서,
3-1) 두번째 성적이 최소값보다 작으면, 채용합니다. 그리고 최소값을 지금값으로 변경합니다.
이렇게 채용될 사람들을 모두 가릴 수 있습니다.
정렬을 했기 때문에 앞의 면접자들은 뒤의 면접자들에 비해서 첫번째 성적이 우수합니다. 즉, 뒤의 면접자가 채용되기 위해서는 앞의 면접자중 두번째 성적이 가장 좋은 사람보다 더 좋은 성적을 가져야 하죠. 뒤의 면접자는 신경쓰지 않아도 되는 것이 뒤의 면접자보다 첫번째 성적이 더 우수하기 때문이죠. 이렇게 함으로써 모든 면접자들과 비교했을 때, 적어도 한개의 성적은 우수하죠.
제가 작성한 소스입니다.
//------------------------------------------------
// baekjoon #1946
// - by Aubrey Choi
// - created at 2019-11-18
//------------------------------------------------
#include <stdio.h>
#include <algorithm>
struct Order { int a, b; };
bool cmp(Order &a, Order &b) { return a.a<b.a; }
int main()
{
Order v[100000]; int t, n, i, min, ans;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d%d",&v[i].a,&v[i].b);
std::sort(v,v+n,cmp);
for(i=0,min=100001,ans=0;i<n;i++) if(v[i].b<min) min=v[i].b,ans++;
printf("%d\n",ans);
}
}
'Programming > BOJ' 카테고리의 다른 글
[C/C++] 백준 #1963 소수 경로(너비 우선 탐색) (2) | 2022.12.09 |
---|---|
[C/C++] 백준 #1956 운동(플로이드 워샬) (2) | 2022.12.09 |
[C/C++] 백준 #1940 주몽(두개의 포인터) (0) | 2022.11.29 |
[C/C++] 백준 #1939 중량제한(그래프) (0) | 2022.11.19 |
[C/C++] 백준 #1937 욕심쟁이 판다(동적 계획법) (0) | 2022.11.17 |
댓글