문제 조건: 채용되기 위해서는 서류 심사 성적과 면접 심사 성적 둘 중 하나는 다른 어떤 사원보다 높아야 한다.
= 서류 심사 성적과 면접 심사 성적이 둘 다 낮은 신입 사원이 한 명이라도 존재하면 신입사원으로 채용될 수 없다
문제 해결 과정:
1) 하나하나 모두 비교하면 O(N^2) -> 10000000000 이기 때문에 제한 시간을 넘어간다.
2) 한 명의 지원자를 대상으로 채용여부를 검사할 때, 그 사원의 서류 점수보다 높은 지원자들과의 면접 점수만 비교하면 된다.
Key
1) 서류 심사 등수 순으로 정렬한다(반대의 경우도 가능)
시간복잡도: O(nlog n) -> Collections.sort
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; 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 NumberFormatException, IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int T=Integer.parseInt(br.readLine()); StringTokenizer str; for(int i=0; i<T; i++) { int count=Integer.parseInt(br.readLine()); int[] paper=new int[count]; int[] interview=new int[count]; ArrayList<Applicant> list=new ArrayList<>(); for(int j=0; j<count; j++) { str=new StringTokenizer(br.readLine()); paper[j]=Integer.parseInt(str.nextToken());//서류등수 interview[j]=Integer.parseInt(str.nextToken());//면접등수 list.add(new Applicant(paper[j], interview[j])); } Collections.sort(list, new Comparator<Applicant>() { //서류 등수가 높은 순으로 정렬한다 @Override public int compare(Applicant o1, Applicant o2) { return o1.paper < o2.paper ? -1 : 1; } }); int ans=count; //합격자는 전체 지원자로 초기화 int in=list.get(0).interview;//서류 1등의 면접 등수로 초기화 for(int j=1; j<list.size(); j++) { //서류 등수가 높은 순 -> j 이전 데이터 중 가장 높은 면접 등수와만 비교하면 됨 int cur=list.get(j).interview; //현재 검사하는 지원자의 면접 등수 if(in < cur){//저장된 면접 등수보다 낮으면 ans--;//감소 } if(cur < in)//높으면 in=cur;//max값 업데이트 } System.out.println(ans); } } } class Applicant{ int paper; int interview; Applicant(int paper, int interview){ this.paper=paper; this.interview=interview; } }
'이론 > 문제풀이' 카테고리의 다른 글
[백준 알고리즘 -2011] 암호코드 - java (신나는 삽질일기) (0) | 2018.09.26 |
---|---|
[백준 알고리즘 -11722] 가장 긴 감소하는 부분 수열 - java (Collections.reverse(), Java 8 Stream API) (0) | 2018.09.24 |
[백준 알고리즘 1464] 1로 만들기 - java(Dynamic Programming) (0) | 2018.09.12 |
[백준 알고리즘 - 2632] 피자판매 - java/완전탐색(재귀호출) (0) | 2018.09.09 |
[백준 알고리즘 - 1208] 부분집합의 합 2 - java/재귀호출 (0) | 2018.09.06 |