백준 - 1946번(신입 사원)

최지홍·2022년 4월 27일
0

백준

목록 보기
125/145

문제 출처: https://www.acmicpc.net/problem/1946


문제

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

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

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


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    private static class Person {

        int paper;
        int interview;

        public Person(int paper, int interview) {
            this.paper = paper;
            this.interview = interview;
        }

    }

    public static void main(String[] args) throws IOException {
        StringBuilder sb = new StringBuilder();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        int T = Integer.parseInt(reader.readLine()); // 테스트케이스 개수

        for (int t = 0; t < T; t++) {
            int N = Integer.parseInt(reader.readLine()); // 지원자 수
            Person[] people = new Person[N];
            StringTokenizer tokenizer = null;
            for (int i = 0; i < N; i++) {
                tokenizer = new StringTokenizer(reader.readLine());
                int paper = Integer.parseInt(tokenizer.nextToken());
                int interview = Integer.parseInt(tokenizer.nextToken());
                people[i] = new Person(paper, interview);
            }

            Arrays.sort(people, Comparator.comparingInt(o -> o.paper));

            int cnt = 0;
            int curr = people[0].interview;

            for (int i = 1; i < N; i++) {
                if (people[i].interview > curr) cnt++;
                else curr = people[i].interview;
            }

            sb.append(N - cnt).append("\n");
        }

        System.out.println(sb);
    }

}

  • 처음에 우선 순위를 입력받는 것부터 잘못 읽어서 헤맸던 문제이다...😥
  • 간단한 로직을 떠올려 문제를 풀었는데 2번 시간초과가 나왔다.
  • O(n)에 해결할 수 있는 로직이 필요함을 느꼈고, 계속 생각하던 중 뇌리를 스치는 로직이 있었다.
  • 먼저 서류 점수로 오름차순 정렬을 한다.
  • 서류 1등은 무조건 통과이므로 그 다음 사람부터 본다.
  • 서류 1등의 면접 점수를 처음 타겟으로 삼아 이보다 순위가 낮은 사람들은 모두 탈락이므로 카운트를 증가한다.
  • 만약 서류 1등의 면접 점수보다 순위가 높은 사람이 나타나면 그 순위를 타겟으로 삼고 계속 반복을 진행한다.
  • 마지막에 전체 인원수에서 카운트 수만큼 빼면 정답이 나오게 된다.!
    사진예시
profile
백엔드 개발자가 되자!

0개의 댓글