알고리즘/BOJ

[BOJ] 1946. 신입 사원

재담 2022. 3. 25. 01:24

문제 원본 : https://www.acmicpc.net/problem/1946

 

1946번: 신입 사원

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

www.acmicpc.net

import java.io.*;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int t = Integer.parseInt(br.readLine());
        StringBuilder builder = new StringBuilder();
        while (t-- > 0) {
            int n = Integer.parseInt(br.readLine());
            Rank[] ranks = new Rank[n];

            StringTokenizer st = null;
            for (int i = 0; i < n; ++i) {
                st = new StringTokenizer(br.readLine());
                ranks[i] = new Rank(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
            }

            Arrays.sort(ranks, Comparator.comparingInt(o -> o.t1));

            int ans = 1;
            int min = ranks[0].t2;
            for (int i = 1; i < n; ++i) {
                if (ranks[i].t2 < min) {
                    min = ranks[i].t2;
                    ++ans;
                }
            }

            builder.append(ans).append("\n");
        }

        bw.write(builder.toString());

        bw.close();
        br.close();
    }

    public static class Rank {
        public int t1;
        public int t2;

        public Rank(int t1, int t2) {
            this.t1 = t1;
            this.t2 = t2;
        }
    }
}
  • 정렬 문제
  • 어느 한쪽을 기준으로 정렬한 다음 반대쪽도 더 낮으면 거르는 방식으로 해결 가능하다.
  • 반대쪽의 순위가 더 높으면 갱신해줘야 한다.
  • 순위 저장용 클래스를 구현할 필요 없이 배열의 인덱스로 바로 저장하면 정렬을 할 필요가 없어진다.
  • 예) ranks[Integer.parseInt(st.nextToken())] = Integer.parseInt(st.nextToken());