알고리즘 문제/백준

[백준 - Java] 1946번 : 신입 사원

건복치 2021. 1. 25. 05:20
반응형

문제

www.acmicpc.net/problem/1946

 

1946번: 신입 사원

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

www.acmicpc.net

설명

처음에는 이해가 안 갔다.

하지만 생각해보면 쉬운 문제.

 

먼저 서류 등수를 기준으로 오름차순 정렬을 한다.

정렬을 해놓으면 이중 for문을 쓰는 등의 일일이 찾는 일 없이, for문 하나로 순차적으로 파악이 가능해진다.

(정렬 안 하고 이중 for문이라도 쓰는 순간 시간 초과남!!)

 

서류 1등은 다른 지원자들과 비교 안 해도 됨.

서류  2등부터 면접 등수만 가지고 다른 지원자보다 떨어지나 안 떨어지나 판단함.

 

처음은 1등의 면접 등수를 최소로 놓고 시작.

2등의 면접 등수가 최소 면접 등수(현재는 1등의 면접 점수) 보다 작다면 합격

최소 면접 등수는 2등의 점수로 갱신

 

위 과정을 마지막 지원자까지 반복하면 합격할 수 있는 최대 인원을 구하게 됨!

전체 코드

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

class Grade implements Comparable<Grade> {
	int a;
	int b;

	Grade(int a, int b) {
		this.a = a;
		this.b = b;
	}

	@Override
	public int compareTo(Grade o) {
		if(this.a > o.a) {
			return 1;
		} else {
			return -1;
		}
	}
}

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();

		for(int t = 0; t < T; t++) {
			int N = sc.nextInt();
			ArrayList<Grade> list = new ArrayList<>();

			for(int i = 0; i < N; i++) {
				int a = sc.nextInt();
				int b = sc.nextInt();

				list.add(new Grade(a, b));
			}

			Collections.sort(list); // 서류 점수 기준 오름차순 정렬 

			int ans = 1; // 서류 1등은 무조건 통과 
			int min = list.get(0).b; // 면접 점수 최소값 
			for(int i = 1; i < N; i++) { // 서류 2등부터 시작 
				if(list.get(i).b < min) { // 이전의 최소 면접 점수보다 낮으면 통과 
					ans++;
					min = list.get(i).b; // 최소 점수 갱신 
				}
			}
			System.out.println(ans);
		}	
	}
}

GITHUB

 

KwonMinha/BOJ

Baekjoon Online Judge(Java) 문제풀이. Contribute to KwonMinha/BOJ development by creating an account on GitHub.

github.com

 

반응형