λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ•Œκ³ λ¦¬μ¦˜

[Java] BOJ 1931 νšŒμ˜μ‹€ λ°°μ •

by 🍊귀🍊 2024. 8. 21.

문제 

문제 링크 https://www.acmicpc.net/problem/1931

  • ν•œ 개의 νšŒμ˜μ‹€μ΄ μžˆλŠ”λ° 이λ₯Ό μ‚¬μš©ν•˜κ³ μž ν•˜λŠ” N개의 νšŒμ˜μ— λŒ€ν•˜μ—¬ νšŒμ˜μ‹€ μ‚¬μš©ν‘œλ₯Ό λ§Œλ“€λ €κ³  ν•œλ‹€.
  • 각 회의 I에 λŒ€ν•΄ μ‹œμž‘μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ΄ μ£Όμ–΄μ Έ 있고, 각 νšŒμ˜κ°€ κ²ΉμΉ˜μ§€ μ•Šκ²Œ ν•˜λ©΄μ„œ νšŒμ˜μ‹€μ„ μ‚¬μš©ν•  수 μžˆλŠ” 회의의 μ΅œλŒ€ 개수λ₯Ό μ°Ύμ•„λ³΄μž.
  • 단, νšŒμ˜λŠ” ν•œλ²ˆ μ‹œμž‘ν•˜λ©΄ 쀑간에 쀑단될 수 μ—†μœΌλ©° ν•œ νšŒμ˜κ°€ λλ‚˜λŠ” 것과 λ™μ‹œμ— λ‹€μŒ νšŒμ˜κ°€ μ‹œμž‘λ  수 μžˆλ‹€.
  • 회의의 μ‹œμž‘μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ΄ 같을 μˆ˜λ„ μžˆλ‹€. 이 κ²½μš°μ—λŠ” μ‹œμž‘ν•˜μžλ§ˆμž λλ‚˜λŠ” κ²ƒμœΌλ‘œ μƒκ°ν•˜λ©΄ λœλ‹€.
  • 첫째 쀄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진닀.
  • λ‘˜μ§Έ 쀄뢀터 N+1 μ€„κΉŒμ§€ 각 회의의 정보가 μ£Όμ–΄μ§€λŠ”λ° 이것은 곡백을 사이에 두고 회의의 μ‹œμž‘μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ΄ 주어진닀. μ‹œμž‘ μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ€ 231-1보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜ λ˜λŠ” 0이닀.
  • 첫째 쀄에 μ΅œλŒ€ μ‚¬μš©ν•  수 μžˆλŠ” 회의의 μ΅œλŒ€ 개수λ₯Ό 좜λ ₯ν•œλ‹€.

아이디어

  • νšŒμ˜μ‹€ μ‹œκ°„μ„ 2차원 배열에 μ‹œμž‘μ‹œκ°„κ³Ό λμ‹œκ°„μ„ μ €μž₯ν•œλ‹€.
  • λλ‚˜λŠ” μ‹œκ°„μ΄ λΉ λ₯Όμˆ˜λ‘ λ§Žμ€ νšŒμ˜μ‹€μ„ λ°°μ •ν•  수 있기 λ•Œλ¬Έμ— λλ‚˜λŠ” μ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ λ¨Όμ € μ •λ ¬ν•œλ‹€.
  • 그리고 λμ‹œκ°„μ΄ κ°™λ‹€λ©΄ μ‹œμž‘μ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ 정렬을 ν•œλ‹€.
  • 정렬을 λ‹€ ν•˜κ³  λ°˜λ³΅λ¬Έμ„ λŒλ¦¬λ©΄μ„œ ν˜„μž¬ νšŒμ˜μ‹€ μ‹œμž‘μ‹œκ°„μ΄ μ €μž₯λ˜μ–΄μžˆλ˜ λλ‚œ μ‹œκ°„λ³΄λ‹€ κ°™κ±°λ‚˜ 크닀면
  • 카운트λ₯Ό ν•΄μ£Όκ³  λλ‚˜λŠ” μ‹œκ°„μ„ ν˜„μž¬ νšŒμ˜μ‹€μ΄ λλ‚˜λŠ” μ‹œκ°„μœΌλ‘œ κ°±μ‹ μ‹œν‚¨λ‹€.  

κ²ͺ은 μ‹œν–‰μ°©μ˜€

  • X (사싀 ν’€λ©΄μ„œ 2차원 λ°°μ—΄λ‘œ ν’€λ©΄ μ‹œκ°„ μ΄ˆκ³Όλ‚˜ λ©”λͺ¨λ¦¬ μ΄ˆκ³Όκ°€ λ‚˜μ§„ μ•Šμ„κΉŒ 걱정을 μ’€ ν–ˆλ‹€...)

λ§žμ•„μ„œ 닀행이닀...γ…Ž

μ½”λ“œ

import java.io.*;
import java.util.*;

public class BOJ1931 {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // νšŒμ˜μ‹€ 개수
        int N = Integer.parseInt(br.readLine());

        // νšŒμ˜μ‹€ μ‹œκ°„ μ €μž₯ν•  λ°°μ—΄
        int office[][] = new int[N][2];

        for(int i = 0; i < N; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());

            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());

            // μ‹œμž‘μ‹œκ°„κ³Ό λμ‹œκ°„ 배열에 μ €μž₯
            office[i][0] = a;
            office[i][1] = b;
        }

        // μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬
        Arrays.sort(office, (n1, n2) -> {
            // λλ‚˜λŠ” μ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ μ •λ ¬ λ§Œμ•½ λΉ„κ΅ν•˜λŠ” 두 값이 κ°™λ‹€λ©΄
            // μ‹œμž‘μ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ μ •λ ¬
            if((n1[1] - n2[1]) == 0){
                return n1[0] - n2[0];
            }

            return n1[1] - n2[1];
        });

        // νšŒμ˜μ‹€ 카운트
        int cnt = 0;
        // λλ‚˜λŠ” μ‹œκ°„ 계산할 λ•Œ μ“Έ λ³€μˆ˜
        int last_time = 0;

        for(int i = 0; i < N; i++){
            // λ§Œμ•½ ν•΄λ‹Ή νšŒμ˜μ‹€ μ‹œμž‘μ‹œκ°„μ΄ μ•žμ— κ³„μ‚°λœ λλ‚œ μ‹œκ°„λ³΄λ‹€
            // κ°™κ±°λ‚˜ 크닀면
            if(office[i][0] >= last_time){
                // νšŒμ˜μ‹€ + 1
                cnt = cnt + 1;
                // λλ‚œ μ‹œκ°„μ„ ν•΄λ‹Ή νšŒμ˜μ‹€ λλ‚˜λŠ” μ‹œκ°„μœΌλ‘œ κ°±μ‹ 
                last_time = office[i][1];
            }
        }

        System.out.println(cnt);
    }
}