백준 No.1946 신입사원 –

문제

항상 최고를 지향하는 일류기업 ㈜진영에서 신입사원을 채용합니다.

인재선발시험은 1차 서류심사와 2차 면접으로 이루어집니다.

최고만을 추구하는 회사의 이념에 따라 최고의 인재만을 채용하고자 합니다.

이에 (주)진영은 서류심사와 면접 중 어느 하나라도 다른 지원자보다 뒤처지지 않는 지원자에 한해 선발하는 원칙을 도입했다.

즉, 지원자 a의 성적과 b 지원자의 성적을 기준으로 서류심사 및 면접 결과를 선발하지 않습니다.

이러한 조건을 만족시키면서 (주)진영에서 채용할 최대 신입사원 수를 구하는 프로그램을 작성하시오. 이번 신입사원 채용에서 선발할 수 있습니다.


2
5
3 2
1 4
4 1
2 3
5 5
7
3 6
7 3
4 2
1 4
5 7
2 5
6 1

즉, 지원자 A의 성적이 다른 지원자의 B보다 서류심사와 면접에서 모두 나쁠 경우 A는 선발되지 않습니다.

이 말이 핵심입니다.

그러나 코드는 정렬되지 않고 출력됩니다.

즉, 먼저 페이지를 오름차순으로 정렬하는 것입니다.

왜 오름차순인가요? -> 오름차순 정렬은 1부터 N까지 정렬됩니다.

1순위는 다른 모든 것보다 점수가 높기 때문에 비교 자체가 필요 없이 통과된다.

2위를 보니 2위에서 1위로 한쪽이 졌다.

그렇다면 상대방은 남고, 상대방도 지면 그대로 탈락된다.

첫 번째 예제를 통해 수행하면


이러한 이유로 일방적인 정렬이 필요합니다.

면접 후 협의 가능

면접으로 분류할 때

4 1

3 2

2 3

1 4

5 5

이렇게 하면 결과는 동일합니다.

근데 여기서 자기보다 면접 순위가 높은 애들 중에 면접 점수가 제일 높아야 하는데..? 이 부분은 가장 큰 값을 임시 변수에 저장하고 더 큰 값이 발견되면 변경합니다.



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.StringTokenizer;

public class Main {

    public static void main(String() args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        for(int i = 0; i < N;i++){
            int M = Integer.parseInt(br.readLine());
            ArrayList<int()> list = new ArrayList<>();
            int count = 1;
            for(int j=0;j<M;j++){
                StringTokenizer st = new StringTokenizer(br.readLine());
                int a = Integer.parseInt(st.nextToken());
                int b = Integer.parseInt(st.nextToken());
                list.add(new int(){a,b});
            }

            list.sort(new Comparator<int()>() {
                @Override
                public int compare(int() o1, int() o2) {
                    return o1(0) - o2(0);
                }
            });

            int temp = list.get(0)(1);	//첫번째 면접 점수

            for (int j = 1; j <= list.size()-1; j++) {
                if(temp > list.get(j)(1)){	//만약 자신보다 전 등수 면접 점수가 크다
                							//그럼 자신이 등수가 높다는 뜻이므로 temp값변경

                    temp = list.get(j)(1);
                    count++;
                }
            }

            System.out.println(count);
        }
    }
}
//https://sanghyu.36