https://www.acmicpc.net/problem/1946
코드설명
탐욕법(Greedy) + 정렬(Sort) 을 활용합니다.
어떻게 탐욕적으로 작성해야할지, 현재 상황에서 최선의 선택을 할지 아이디어를 떠올리는것이 어려웠습니다.
코드 로직입니다.
1. 서류점수를 기준으로만 해서 (서류점수, 면접점수)를 정렬합니다.
이렇게 되면 서류점수 1등을 기준으로, 서류점수1등보다 2 3 4 5 6 7.. 등은 모두 서류점수가 낮은것이므로 면접점수가 반드시 높아야합니다.
2. 면접점수를 비교하기 시작합니다.
이때, 유의할사항은, 서류점수 1등의 면접점수보다 더 높은 면접점수를 가진 사람이 등장할때마다, minInterviewRank, 다음사람이 통과해야할 서류점수가 더 높아진다는 것 입니다.
이유는, 서류등수가 오름차순으로 정렬되어있기에 이번에 연산하는 사람은 이전 연산하는 사람보다 더 낮은 서류점수를 가지고 있으므로 적어도 면접 점수는 더 높아야한다는 것 입니다. 그래야만
" 진영 주식회사는, 다른 모든 지원자와 비교했을 때 서류심사 성적과 면접시험 성적 중 적어도 하나가 다른 지원자보다 떨어지지 않는 자만 선발한다는 원칙을 세웠다 " 이 규칙을 지킬 수 있는 것이지요. 이 과정을 통해 "지금까지 선발된 지원자들 중 가장 좋은 면접순위"를 계속해서 갱신해나가며, 다음번의 서류면접점수가 상대적으로 낮은 지원자가 해당 면접순위보다 높아야만 들어올 수 있도록 처리합니다.
즉, 어떻게 보면 서류점수로 먼저, 필터링한뒤 면접점수로 필터링한다라고 생각하면 될 것 같습니다.
코드
package Main; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.Comparator; import java.util.StringTokenizer; public class Main { static int N, M, S, P, A, B, X, L, R, C, n, k, m, l, K, D, T; static int answer = 0; static int[][] arr; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); T = Integer.parseInt(st.nextToken()); while(T-- > 0) { st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); arr = new int[N][2]; for(int i=0;i<N; i++) { st = new StringTokenizer(br.readLine()); arr[i][0] = Integer.parseInt(st.nextToken()); arr[i][1] = Integer.parseInt(st.nextToken()); } //서류점수로 오름차순 정렬합니다. Arrays.sort(arr, 0, N, new Comparator<int[]>() { @Override public int compare(int[] a, int[] b) { return Integer.compare(a[0], b[0]); } }); //서류점수에서 오름차순 정렬한뒤, 서류점수 1등인 사람의 면접점수를 가져옵니다. answer = 1; int minInterviewRank = arr[0][1]; for(int i=1; i<N; i++) { if(minInterviewRank > arr[i][1]) { answer += 1; minInterviewRank = arr[i][1]; } } System.out.println(answer); } } }
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2502 떡 먹는 호랑이 - 동적계획법(DP, Dynamic Programming) + 완전탐색(BruteForce) JAVA (0) | 2024.10.02 |
---|---|
[백준] 2468 안전 영역 - BFS(넓이우선탐색) JAVA (0) | 2024.10.01 |
[백준] 1926 그림 - BFS(너비우선탐색) JAVA (0) | 2024.09.27 |
[백준] 1743 음식물 피하기 - BFS(너비우선탐색) JAVA (0) | 2024.09.26 |
[백준] 1697 숨바꼭질 - BFS(너비우선탐색) JAVA (1) | 2024.09.26 |