πŸ† [Baekjoon / Java] 2586. 전깃쀄 - 2

μ΄ν•˜μ–€Β·2024λ…„ 12μ›” 22일
0

🐣 λ°±μ€€

λͺ©λ‘ 보기
37/37

문제 μ„€λͺ…


πŸ’‘ Info

λ‚΄μš©

두 μ „λ΄‡λŒ€ A와 B 사이에 ν•˜λ‚˜ λ‘˜μ”© 전깃쀄을 μΆ”κ°€ν•˜λ‹€ λ³΄λ‹ˆ 전깃쀄이 μ„œλ‘œ κ΅μ°¨ν•˜λŠ” κ²½μš°κ°€ λ°œμƒν•˜μ˜€λ‹€. ν•©μ„ μ˜ μœ„ν—˜μ΄ μžˆμ–΄ 이듀 쀑 λͺ‡ 개의 전깃쀄을 μ—†μ•  전깃쀄이 κ΅μ°¨ν•˜μ§€ μ•Šλ„λ‘ λ§Œλ“€λ €κ³  ν•œλ‹€.

예λ₯Ό λ“€μ–΄, <κ·Έλ¦Ό 1>κ³Ό 같이 전깃쀄이 μ—°κ²°λ˜μ–΄ μžˆλŠ” 경우 A의 1번 μœ„μΉ˜μ™€ B의 8번 μœ„μΉ˜λ₯Ό μž‡λŠ” 전깃쀄, A의 3번 μœ„μΉ˜μ™€ B의 9번 μœ„μΉ˜λ₯Ό μž‡λŠ” 전깃쀄, A의 4번 μœ„μΉ˜μ™€ B의 1번 μœ„μΉ˜λ₯Ό μž‡λŠ” 전깃쀄을 μ—†μ• λ©΄ λ‚¨μ•„μžˆλŠ” λͺ¨λ“  전깃쀄이 μ„œλ‘œ κ΅μ°¨ν•˜μ§€ μ•Šκ²Œ λœλ‹€.

전깃쀄이 μ „λ΄‡λŒ€μ— μ—°κ²°λ˜λŠ” μœ„μΉ˜λŠ” μ „λ΄‡λŒ€ μœ„μ—μ„œλΆ€ν„° μ°¨λ‘€λŒ€λ‘œ λ²ˆν˜Έκ°€ 맀겨진닀. μ „κΉƒμ€„μ˜ κ°œμˆ˜μ™€ 전깃쀄듀이 두 μ „λ΄‡λŒ€μ— μ—°κ²°λ˜λŠ” μœ„μΉ˜μ˜ λ²ˆν˜Έκ°€ μ£Όμ–΄μ§ˆ λ•Œ, λ‚¨μ•„μžˆλŠ” λͺ¨λ“  전깃쀄이 μ„œλ‘œ κ΅μ°¨ν•˜μ§€ μ•Šκ²Œ ν•˜κΈ° μœ„ν•΄ μ—†μ• μ•Ό ν•˜λŠ” μ΅œμ†Œ 개수의 전깃쀄을 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

πŸ“₯μž…λ ₯ 쑰건

  • 첫째 μ€„μ—λŠ” 두 μ „λ΄‡λŒ€ μ‚¬μ΄μ˜ μ „κΉƒμ€„μ˜ κ°œμˆ˜κ°€ 주어진닀.
  • μ „κΉƒμ€„μ˜ κ°œμˆ˜λŠ” 100,000 μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€.
  • λ‘˜μ§Έ 쀄뢀터 ν•œ 쀄에 ν•˜λ‚˜μ”© 전깃쀄이 Aμ „λ΄‡λŒ€μ™€ μ—°κ²°λ˜λŠ” μœ„μΉ˜μ˜ λ²ˆν˜Έμ™€ Bμ „λ΄‡λŒ€μ™€ μ—°κ²°λ˜λŠ” μœ„μΉ˜μ˜ λ²ˆν˜Έκ°€ μ°¨λ‘€λ‘œ 주어진닀.
  • μœ„μΉ˜μ˜ λ²ˆν˜ΈλŠ” 500,000 μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄κ³ , 같은 μœ„μΉ˜μ— 두 개 μ΄μƒμ˜ 전깃쀄이 연결될 수 μ—†λ‹€.
8
1 8
3 9
2 2
4 1
6 4
10 10
9 7
7 6

πŸ“€μΆœλ ₯ 쑰건

  • 첫째 쀄에 λ‚¨μ•„μžˆλŠ” λͺ¨λ“  전깃쀄이 μ„œλ‘œ κ΅μ°¨ν•˜μ§€ μ•Šκ²Œ ν•˜κΈ° μœ„ν•΄ μ—†μ• μ•Ό ν•˜λŠ” μ „κΉƒμ€„μ˜ μ΅œμ†Œ 개수λ₯Ό 좜λ ₯ν•œλ‹€.
  • λ‘˜μ§Έ 쀄뢀터 ν•œ 쀄에 ν•˜λ‚˜μ”© μ—†μ• μ•Ό ν•˜λŠ” μ „κΉƒμ€„μ˜ A μ „λ΄‡λŒ€μ— μ—°κ²°λ˜λŠ” μœ„μΉ˜μ˜ 번호λ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 좜λ ₯ν•œλ‹€.
  • λ§Œμ•½ 닡이 두 가지 이상이라면 κ·Έ 쀑 ν•˜λ‚˜λ₯Ό 좜λ ₯ν•œλ‹€.
3
1
3
4


문제 이해


μ•Œκ³ λ¦¬μ¦˜ 및 μ΅œμ’… 풀이


μ‹€μ œ 풀이 μ‹œκ°„ : 1μ‹œκ°„ 55λΆ„(첫 풀이 μ‹œκ°„ 포함)

  • μž…λ ₯

    • 전기쀄 점(a,b) -> μ‹œμž‘μ , 끝점
  • 계산

    • 전깃쀄 μ—°κ²°ν•˜κΈ°
      • 전깃쀄 끝점 κΈ°μ€€ μˆœμ„œ μ°ΎκΈ°
      • ꡐ차 μ•ˆλœ 전깃쀄 μ €μž₯ -> 이진 탐색 μ‚¬μš©
  • 좜λ ₯

    • 남은 전깃쀄 번호 μ—­μˆœ 좜λ ₯
import java.util.*;

class Line {
    int a, b;

    public Line(int a, int b) {
        this.a = a;
        this.b = b;
    }
}

public class Main {

    static int n;
    static Line[] lines = new Line[500001];
    static List<Line> ary;
    static List<Integer> result = new ArrayList<>();
    static int[] index = new int[500001];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        ary = new ArrayList<>();

        for (int i = 0; i < n; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            lines[a] = new Line(a, b);
        }

        for (int i = 0; i < 500001; i++) {
            if (lines[i] == null) continue;

            if (ary.isEmpty() || ary.get(ary.size() - 1).b < lines[i].b) {
                ary.add(lines[i]);
                index[lines[i].a] = ary.size() - 1;
            } 
            if (!(ary.isEmpty() || ary.get(ary.size() - 1).b < lines[i].b)) {
                int idx = getCorrectIndex(0, ary.size() - 1, lines[i].b);
                ary.set(idx, lines[i]);
                index[lines[i].a] = idx;
            }
        }

        int limit = ary.size() - 1;
        for (int i = 500000; i >= 0; i--) {
            if (lines[i] == null) continue;
            if (index[i] == limit) {
                limit--;
            } else {
                result.add(lines[i].a);
            }
        }

        System.out.println(n - ary.size());
        Collections.reverse(result);
        for (int res : result) {
            System.out.println(res);
        }
    }

    public static int getCorrectIndex(int left, int right, int value) {
        while (left < right) {
            int mid = (left + right) / 2;
            if (ary.get(mid).b >= value) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        return left;
    }
}

profile
μ–Έμ  κ°€ λ‚΄ μ½”λ“œλ‘œ 세상에 κΈ°μ—¬ν•  수 μžˆλ„λ‘, BE&Data Science 개발 기둝 λ…ΈνŠΈβ˜˜οΈ

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보