일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 항해99
- 정렬
- 백준
- 백트래킹
- 그래프 이론
- 데이터베이스
- Til
- 코딩테스트준비
- 알고리즘
- 네트워크 계층
- 동적 프로그래밍
- 완전탐색
- BinarySearch
- 스프링
- 브루트포스
- 트리
- DP
- Spring
- 우선순위큐
- 스프링 핵심 원리 - 기본편
- DFS
- 그리디
- 자바
- lower bound
- 개발자취업
- 99클럽
- 그래프
- 프로그래머스
- Java
- BFS
- Today
- Total
AtraFelis's Develop Diary
[99클럽 코테스터디 19일차 TIL / 백준] 1945 - 신입 사원 (그리디, 정렬) 본문
99클럽 코테스터디 19일차 TIL
KeyWord : 그리디, 정렬
문제
언제나 최고만을 지향하는 굴지의 대기업 진영 주식회사가 신규 사원 채용을 실시한다. 인재 선발 시험은 1차 서류심사와 2차 면접시험으로 이루어진다. 최고만을 지향한다는 기업의 이념에 따라 그들은 최고의 인재들만을 사원으로 선발하고 싶어 한다.
그래서 진영 주식회사는, 다른 모든 지원자와 비교했을 때 서류심사 성적과 면접시험 성적 중 적어도 하나가 다른 지원자보다 떨어지지 않는 자만 선발한다는 원칙을 세웠다. 즉, 어떤 지원자 A의 성적이 다른 어떤 지원자 B의 성적에 비해 서류 심사 결과와 면접 성적이 모두 떨어진다면 A는 결코 선발되지 않는다.
이러한 조건을 만족시키면서, 진영 주식회사가 이번 신규 사원 채용에서 선발할 수 있는 신입사원의 최대 인원수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성적, 면접 성적의 순위가 공백을 사이에 두고 한 줄에 주어진다. 두 성적 순위는 모두 1위부터 N위까지 동석차 없이 결정된다고 가정한다.
출력
각 테스트 케이스에 대해서 진영 주식회사가 선발할 수 있는 신입사원의 최대 인원수를 한 줄에 하나씩 출력한다.
풀이
이해하는데 한참 걸렸던 문제였다.
어떤 지원자 A의 성적이 다른 어떤 지원자 B의 성적에 비해 서류 심사 결과와 면접 성적이 모두 떨어진다면 A는 결코 선발되지 않는다. 이 문이 도통 와닿지 않았던 데다가, 그냥 성적이 아닌 순위가 들어온다는 것을 좀 나중에 알았기 때문이다. 어쩐지 뭔가 이상하더라.
그래도 문제 자체는 그렇게까지 어렵지 않았던 듯하다.
- 서류 심사 순위를 기준으로 오름차순 정렬한다.
- 면접 심사 순위로 하여도 상관없다
- 서류 심사 순위 2위부터 자신보다 서류 순위가 높은 인원 중 자신보다 면접 순위가 높은 인원이 있는지 확인한다.
- 존재한다면 불합격, 존재하지 않는다면 합격
- 여기서 서류 1위의 경우에는 서류에서 자신보다 높은 순위가 없어 반드시 합격 대상이다.
정렬의 경우에는 존재하는 메서드를 이용하여 정렬해주면 되니, 1번 로직의 경우에는 쉽게 구현할 수 있다.
아마 문제가 생겼다면, 2번 로직에서 시간 초과로 효율성 체크를 통과하지 못했기 때문일 것이다. 완전탐색으로 면접 순위를 비교할 경우 시간초과가 나타나기 때문이다.
// 완전탐색 - 시간초과 Fail
int answer = 1;
for (int i = 1; i < N; i++) {
boolean isAcceptance = true;
for (int j = 0; j < i; j++) {
if (volunteers[i].interviewRank > volunteers[j].interviewRank) {
isAcceptance = false;
break;
}
}
if (isAcceptance) {
answer++;
}
}
이렇게 완전탐색을 진행하면, 시간 복잡도가 $O(N^2)$이 되버리므로 시간 초과가 나타난다.
가장 마지막에 합격한 지원자가 현재 가장 높은 순위의 면접 순위를 가진다는 것을 생각하면 쉽게 해결할 수 있다.
int answer = 1; // 0번은 서류 1위라 반드시 뽑히므로 제외
int topRate = volunteers[0].interviewRank;
for (int i = 1; i < N; i++) {
if (volunteers[i].interviewRank < topRate) {
answer++;
topRate = volunteers[i].interviewRank;
}
}
즉, 이렇게 합격자가 나올 때마다 면접 순위 최고점자를 갱신하면 된다. 이것으로 $O(N^2)$이었던 코드를 $O(N)$으로 개선할 수 있다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
private static class Volunteer implements Comparable<Volunteer> {
int documentRank;
int interviewRank;
public Volunteer(int document, int interview) {
this.documentRank = document;
this.interviewRank = interview;
}
@Override
public int compareTo(Volunteer o) {
return this.documentRank - o.documentRank;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
while(T-- > 0) {
int N = Integer.parseInt(br.readLine());
Volunteer[] volunteers = new Volunteer[N];
for(int i = 0; i < N; i++) {
StringTokenizer stk = new StringTokenizer(br.readLine());
int document = Integer.parseInt(stk.nextToken());
int interview = Integer.parseInt(stk.nextToken());
volunteers[i] = new Volunteer(document, interview);
}
// 서류 순위 기준 오름차순 정렬 - compareTo() 메소드
Arrays.sort(volunteers);
// 1번부터 자신보다 서류 순위가 높은 인원 중
// 자신보다 인터뷰 순위가 높은 인원이 있는지 확인
int answer = 1; // 0번은 서류 1위라 반드시 뽑히므로 제외
int topRate = volunteers[0].interviewRank;
for (int i = 1; i < N; i++) {
if (volunteers[i].interviewRank < topRate) {
answer++;
topRate = volunteers[i].interviewRank;
}
}
sb.append(answer).append("\n");
}
System.out.println(sb);
}
}
'Algorithm > 백준' 카테고리의 다른 글
[99클럽 코테스터디 21일차 TIL / 백준] 1003 - 피보나치 함수 (DP) (0) | 2025.02.17 |
---|---|
[99클럽 코테스터디 20일차 TIL / 백준] 19598 - 최소 회의실 개수 (그리디, 정렬, 우선순위큐) (0) | 2025.02.14 |
[99클럽 코테스터디 18일차 TIL / 백준] 17503 - 맥주 축제 (그리디, 정렬, 우선순위큐) (0) | 2025.02.12 |
[99클럽 코테스터디 17일차 TIL / 백준] 11399 - ATM (그리디, 정렬) (0) | 2025.02.11 |
[99클럽 코테스터디 16일차 TIL / 백준] 27961 - 고양이는 많을 수록 좋다 (그리디) (0) | 2025.02.10 |