https://www.acmicpc.net/problem/1946
- 예제 입력1
2
5
3 2
1 4
4 1
2 3
5 5
7
3 6
7 3
4 2
1 4
5 7
2 5
6 1
- 예제 출력1
4
3
- 문제 접근
- 첫 째줄에 테스트 케이스의 개수가 주어짐
- 테스트 케이스의 첫째 줄에는 지원자 수가 주어지고, 이후 지원자 수만큼 [서류 성적, 면접 성적] 두 개가 공백으로 주어짐
- 현재의 지원자가 다른 지원자 단 한명이라도, 서류 성적 또는 면접 성적이 떨어질 경우 선발되지 않음
- 출력 ⇒ 테스트 케이스마다 선발할 수 있는 신입 사원의 수
- 문제 해결
- [서류 성적, 면접 성적]을 멤버 변수로 갖는 클래스를 선언
- 지원자 수 만큼 클래스의 배열을 생성
- 클래스 배열을 서류 성적 순으로 정렬
- 최소 면접 점수를 저장하는 변수를 선언하여, 현재 지원자의 면접 점수가 더 낮다면 최소 면접 점수를 갱신하고 신입 사원 카운팅
- 기존 풀이 [메모리 : 322744 KB / 시간 : 2852 ms]
public class No1946 {
public static void main(String[] args) throws Exception{
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int TestCase = Integer.parseInt(br.readLine());
for(int i = 0; i < TestCase; i++){
// 지원자 수 입력
int applicantCount = Integer.parseInt(br.readLine());
// 지원자 수 만큼 배열 생성
Applicant[] applicant = new Applicant[applicantCount];
// 신입사원 숫자 체크 변수
int new_worker_count = 0;
for(int j = 0; j < applicantCount; j++){
st = new StringTokenizer(br.readLine());
int document_grade = Integer.parseInt(st.nextToken());
int interview_grade = Integer.parseInt(st.nextToken());
applicant[j] = new Applicant(document_grade, interview_grade);
}
// 서류 등수를 기준으로 정렬
Arrays.sort(applicant);
// 현재까지의 최소 면접 점수를 저장할 변수
int min_interview_grade = Integer.MAX_VALUE;
for(Applicant app : applicant){
// 최소 면접 등수보다 현재 지원자가 더 낮다면(더 높은 등수)
if(min_interview_grade > app.interview_grade){
// 최소 면접 등수 갱신
min_interview_grade = app.interview_grade;
// 신입 사원으로 채용
new_worker_count++;
}
}
sb.append(new_worker_count).append("\n");
}
System.out.println(sb);
}
}
class Applicant implements Comparable<Applicant>{
int document_grade;
int interview_grade;
public Applicant(int document_socre, int interview_score){
this.document_grade = document_socre;
this.interview_grade = interview_score;
}
@Override
public String toString(){
return "[" + document_grade + ", " + interview_grade + "]";
}
// 정렬 기준 => 서류 점수를 기준으로 오름차순
@Override
public int compareTo(Applicant applicant) {
return Integer.compare(this.document_grade, applicant.document_grade);
}
}
처음에는 현재 지원자를 기준으로 이전 모든 지원자를 비교하는 방식으로 하여 O(n^2)이 너무 많아 시간 초과가 발생한 것으로 보임
min_interview_grade 같은 변수를 적극 활용하는 것을 항상 명심할 것
'Coding Test > Problem Number' 카테고리의 다른 글
[Java] 완전 이진 트리 [9934번] (0) | 2024.07.27 |
---|---|
[Java] 30번 [13116번] (0) | 2024.07.27 |
[Java] 보물 [1026번] (0) | 2024.07.26 |
[Java] 패션왕 [9375번] (0) | 2024.07.25 |
[Java] 크리스마스 선물 [14235번] (0) | 2024.07.25 |