신입+사원

언제나 최고만을 지향하는 굴지의 대기업 ㈜네이모가 신규 사원 채용을 실시한다. 인재 선발 시험은 1차 서류심사와 2차 면접시험으로 이루어진다. 최고만을 지향한다는 기업의 이념에 따라 그들은 최고의 인재들만을 사원으로 선발하고 싶어한다. 그래서 ㈜네이모는 다른 모든 지원자와 비교했을 때, 서류심사 성적과 면접시험 성적 중 적어도 하나가 다른 지원자보다 떨어지지 않는 자만 선발한다는 원칙을 세웠다. 즉, 어떤 지원자 A의 성적이 다른 어떤 지원자 B의 성적에 비해 서류 심사 결과와 면접 성적이 모두 떨어진다면 A는 선발되지 않는다. ㈜네이모는 이 조건에 해당하지 않는 지원자 모두를 선발하고 싶다. 몇 명이나 선발할 수 있을까? 지원자의 수는 N 명으로 주어진다. 입력은 지원자들의 채용 시험 결과로 주어진다. 각각의 지원자들의 채용시험 결과는 서류심사 성적과 면접시험 성적으로, N명에서의 각각의 순위가 a, b 순서쌍으로 주어진다. 가령1000명의 지원자 중에서 어떤 지원자의 서류심사 성적이 20번째, 면접 성적이 340번째라면 (20, 340)의 형태로 채용 시험 결과가 주어진다. 여기서 서류심사 성적, 면접 성적의 우열은 명확하게 구별되어서 같은 수준의 서류심사 성적 또는 면접 성적을 갖는 지원자들은 없다고 가정한다. N명의 지원자들의 채용 시험 결과들이 주어졌을 때 ㈜네이모는 최대 몇 명의 신입사원을 선발할 수 있는지 알아내는 프로그램을 작성하시오.

입력
입력은 표준입력(standard input)을 통해 받아들인다. 입력의 첫 줄에는 테스트 케이스의 개수 T (1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스는 첫째 줄에 지원자의 숫자 N (1 ≤ N ≤ 100000) 이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성적, 면접 성적의 순위가 공백을 사이에 두고 한 줄에 주어진다.

출력
출력은 표준출력(standard output)을 통하여 출력한다. 각 테스트 케이스에 대해서 ㈜네이모가 선발할 수 있는 신입사원의 최대 인원수를 한 줄에 하나씩 출력하시오.

Sample Input
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

Sample Output
4 3

Source Code code format="java5" public class Recruit { public static void main(String[] args) { /*int[][] rank = { {3, 2},               {1, 4},                {4, 1},                {2, 3},                {5, 5}};*/

int[][] rank = { {3, 6},               {7, 3},                {4, 2},                {1, 4},                {5, 7},                {2, 5},                {6, 1}};

System.out.println(employ(rank)); }

public static int employ(int[][] rank) { return pick(sortedRank(rank)); }

// 첫번째 성적 순으로 정렬한다. private static int[] sortedRank(int[][] rank) { int[] newRank = new int[rank.length];

for(int i = 0; i < rank.length; i++) { newRank[rank[i][0] - 1] = rank[i][1]; }

return newRank; }

// 두번째 성적으로 적당한 사람을 골라낸다. private static int pick(int[] rank) { int count = 0; int min = Integer.MAX_VALUE;

for(int i = 0; i < rank.length; i++) { if(rank[i] < min) { count++; min = rank[i]; }       }

return count; } } code

Comment