백준 1946번 - 신입 사원
https://www.acmicpc.net/problem/1946
1946번: 신입 사원
첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성
www.acmicpc.net
이 문제는 문제 자체를 이해하기 힘들었던 문제이다.
둘째 줄부터의 숫자는 서류, 면접 성적의 순위를 입력한 것이며 이에 선발할 수 있는 최대 인원 수를 출력해야 한다.
예제 입력1 과 같은 예시가 있을 때 먼저 서류 면접이 1등인 사원인 1 4 를 기준으로 비교했을 때
2 3 은 면접 성적이 더 높기 때문에 합격이고
3 2 는 2 3 보다 면접 성적이 더 높기 때문에 합격,
4 1 은 3 2 보다 면접 성적이 더 높기 때문에 합격이다.
만약 다음과 같은 예제가 있을 때에는
1 4
2 5 를 비교했을 때 서류, 면접 둘 다 순위가 낮기 때문에 불합격
1 4
3 6 를 비교했을 때 서류, 면접 둘 다 순위가 낮기 때문에 불합격
1 4
4 2 를 비교했을 때 면접 부분에서 순위가 더 높기 때문에 합격
4 2
5 7 를 비교했을 때 서류, 면접 둘 다 순위가 낮기 때문에 불합격
4 2
6 1 를 비교했을 때 면접 부분에서 순위가 더 높기 때문에 합격
6 1
7 3 를 비교했을 때 서류, 면접 둘 다 순위가 낮기 때문에 불합격
따라서 출력 값은 면접순위가 1등인 (1 4 사원) + (4 2 사원) + (6 1 사원) 해서 3이 나온다.
코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
int arr[][];
int count=0;
for(int i=0;i<N;i++)
{
count=1;
int J = Integer.parseInt(br.readLine());
arr = new int[J][2];
for(int j=0;j<J;j++)
{
st = new StringTokenizer(br.readLine());
arr[j][0] = Integer.parseInt(st.nextToken());
arr[j][1] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr,(o1,o2)->{ return o1[0]-o2[0]; });
int std = arr[0][1];
for(int j=1;j<J;j++)
{
if(arr[j][1]<std)
{
std = arr[j][1];
count++;
}
}
System.out.println(count);
}
}
}
여기서 다음 식은 람다식을 이용하여 arr[ ][0] 부분을 기준으로 오름차순 정렬한 식이다.
Arrays.sort(arr,(o1,o2)->{ return o1[0]-o2[0]; });