본문 바로가기

알고리즘

[BOJ] BOJ 1946.신입사원 (JAVA)

<문제>

https://www.acmicpc.net/problem/1946

 

1946번: 신입 사원

첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성

www.acmicpc.net

언제나 최고만을 지향하는 굴지의 대기업 진영 주식회사가 신규 사원 채용을 실시한다. 인재 선발 시험은 1차 서류심사와 2차 면접시험으로 이루어진다. 최고만을 지향한다는 기업의 이념에 따라 그들은 최고의 인재들만을 사원으로 선발하고 싶어 한다.

그래서 진영 주식회사는, 다른 모든 지원자와 비교했을 때 서류심사 성적과 면접시험 성적 중 적어도 하나가 다른 지원자보다 떨어지지 않는 자만 선발한다는 원칙을 세웠다. 즉, 어떤 지원자 A의 성적이 다른 어떤 지원자 B의 성적에 비해 서류 심사 결과와 면접 성적이 모두 떨어진다면 A는 결코 선발되지 않는다.

이러한 조건을 만족시키면서, 진영 주식회사가 이번 신규 사원 채용에서 선발할 수 있는 신입사원의 최대 인원수를 구하는 프로그램을 작성하시오.

 

<풀이>

서류심사 성적과 면접 시험 성적을 담고있는 배열을 서류심사 성적 순으로 정렬한다.

두 성적 모두 어떤 지원자보다 떨어지게 되면 탈락이기때문에 서류 성적 순으로 정렬되었을 때 뒤에 있는 지원자의 면접순위는 앞 지원자들의 면접 순위보다 높아야한다.

순위로 주어지기 때문에 작을수록 성적이 좋은 것이다. min값을 계속 갱신해주어야한다.

 

<코드>

package A0302;

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 BOJ1946_신입사원 {
	static int N;
	static int[][] grade; 
	static int cnt;
	
	static void check() {
		cnt=1;
		int min = grade[0][1];
		for(int i=1;i<N;i++) {
			if(grade[i][1]<min) {
				cnt++;
				min=grade[i][1];
			}
		}
	}
	public static void main(String[] args) throws Exception, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		int T = Integer.parseInt(br.readLine());
		
		for(int tc=1;tc<=T;tc++) {
			N = Integer.parseInt(br.readLine());
			grade = new int[N][2];
			
			for(int i=0;i<N;i++) {
				st = new StringTokenizer(br.readLine());
				grade[i][0]=Integer.parseInt(st.nextToken());
				grade[i][1]=Integer.parseInt(st.nextToken());
			}
			Arrays.sort(grade, new Comparator<int[]>() { 
				@Override 
				public int compare(int[] o1, int[] o2) {
					if(o1[0] == o2[0]) {
						return o1[1] - o2[1]; 
					}
					else { 
						return o1[0] - o2[0]; 
					} 
				} 
			});


			check();
			System.out.println(cnt);
		}
	}
}

<느낀점>

이차원배열 정렬을 확실히 알아두어야겠다.

처음에 주어진 성적이 순위인 줄 몰라서 조금 헤맸다. 문제를 꼼꼼히 읽어야겠다.

시간초과가 떴었는데, 정렬을 하지 않고 for문을 두번 사용해서 시간초과가 날 수 밖에 없었다. 시간이 얼만큼 걸릴지 예상하는게 아직도 어렵다.