알고리즘/백준 풀이(그리디)

백준 1946번 - 신입 사원

공부 기록장 2024. 1. 19. 17:25

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]; });