Algorithm/BOJ

[Boj_22963] 3์ดˆ ์ •๋ ฌ

jeong_ii 2025. 2. 26. 14:55

๐Ÿ“Ž ๋ฌธ์ œ ๋งํฌ

https://www.acmicpc.net/problem/22963

 

โ–ธ ๋ฌธ์ œ

์ง€๊ธˆ ์—ฌ๋Ÿฌ๋ถ„์ด ํ‰ํ™”๋กญ๊ฒŒ ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ์žˆ๋Š” ์‚ฌ์ด, ์ด๋ฏธ ๊ฐ•๋‹น ๋ฐ–์—๋Š” ๊ทน๋‹จ ์›๋ฆฌ์ฃผ์˜ ๋ฏผ์ดˆํŒŒ ํ…Œ๋Ÿฌ๋ฆฌ์ŠคํŠธ ๊น€์ค€์›์ด ํ•™๊ต๋ฅผ ์ ๋ นํ–ˆ๋‹ค.

์ž…๋ ฅ๋ฐ›์€ ์ˆ˜์—ด์„ 3์ดˆ ์•ˆ์— ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ๋งŒ๋“ค์ง€ ์•Š์œผ๋ฉด ๊ฐ•๋‹น์— ์„ค์น˜ํ•ด๋†“์€ ๋ฏผ์ดˆ ํญํƒ„์ด ํ„ฐ์ง„๋‹ค.

๋‹น์‹ ์€ ์ˆ˜์—ด์˜ ์–ด๋–ค ์›์†Œ Ai๋ฅผ ๋‹ค๋ฅธ ์ˆ˜ X๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

์ด ์—ฐ์‚ฐ์—๋Š” 1์ดˆ๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค.

3...

2...

1...

 

โ–ธ ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋‹น์‹ ์ด ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ์ˆ˜์—ด์˜ ๊ธธ์ด N์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„์— ์ˆ˜์—ด์˜ ์›์†Œ๋“ค์„ ๋‚˜ํƒ€๋‚ด๋Š” N๊ฐœ์˜ ์ •์ˆ˜ A1,A2,โ‹ฏ,AN์ด ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

3๋ฒˆ์˜ ์—ฐ์‚ฐ ์•ˆ์— ์ˆ˜์—ด์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉด,

  • ์ฒซ์งธ ์ค„์— YES๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
  • ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ, ์ˆ˜์—ด์„ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.
    • ์ฒซ์งธ ์ค„์—, ์—ฐ์‚ฐ ํšŸ์ˆ˜ K๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
    • ์ดํ›„, K๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ, ์ ์šฉํ•  ์—ฐ์‚ฐ์„ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•œ๋‹ค.
      ๊ตฌ์ฒด์ ์œผ๋กœ, ๊ฐ ์ค„์— ๋‘ ์ •์ˆ˜ i์™€ X๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์ด๋Š”, ์›์†Œ Ai๋ฅผ X๋กœ ๋ฐ”๊พธ๋Š” ์—ฐ์‚ฐ์„ ์˜๋ฏธํ•œ๋‹ค. (1≤i≤N, 1≤X≤1000000000)
      ์—ฐ์‚ฐ์˜ ํšŸ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์ด ์—ฌ๋Ÿฟ ์žˆ์œผ๋ฉด ์•„๋ฌด ๋ฐฉ๋ฒ•์ด๋‚˜ ํ•˜๋‚˜ ์ถœ๋ ฅํ•ด๋„ ๊ดœ์ฐฎ๋‹ค. ๊ฐ™์€ ์›์†Œ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜์ •ํ•ด๋„ ๋œ๋‹ค.
      3๋ฒˆ์˜ ์—ฐ์‚ฐ ์•ˆ์— ์ˆ˜์—ด์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†์œผ๋ฉด,
  • ์ฒซ์งธ ์ค„์— NO๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

โ–ธ ์ œํ•œ

  • 1≤N≤200000
  • โ€Š1≤Ai≤1000000000 (1≤i≤N)
  • ์ด๋ฏธ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ์ˆ˜์—ด์€ ์ฃผ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.

 

๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด

  • ๐Ÿฅ‡  ๋ฌธ์ œ ๋ ˆ๋ฒจ : ๊ณจ๋“œ 1
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด: o(n log n)
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

๐Ÿค” ๋ฌธ์ œ ํ’€์ด

๋จผ์ €, ์กฐ๊ฑด์— ๋งž๊ฒŒ ์ˆ˜์—ด์˜ ๊ธธ์ด N๊ณผ ์ˆ˜์—ด A๋ฅผ ์ž…๋ ฅ๋ฐ›์•˜๋‹ค.

์ด๋•Œ, ์ˆ˜์—ด์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’์ด ํ•ญ์ƒ ์ตœ๋Œ“๊ฐ’์ด๋ผ๋Š” ๋ณด์žฅ์ด ์—†์œผ๋ฏ€๋กœ, ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ n+1๋กœ ์„ค์ •ํ•˜๊ณ  ๋ ๊ฐ’์„ ์ตœ๋Œ“๊ฐ’์œผ๋กœ ์„ค์ •ํ–ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์—ฐ์‚ฐ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ถ„ ํƒ์ƒ‰์„ ํ™œ์šฉํ•˜์—ฌ LIS์˜ ๊ธธ์ด๋ฅผ ๊ณ„์‚ฐํ–ˆ๋‹ค.

์ˆ˜์—ด์˜ ๊ธธ์ด N์—์„œ LIS์˜ ๊ธธ์ด๋ฅผ ๋นผ๋ฉด, ์ˆ˜์—ด A๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์—ฐ์‚ฐ ํšŸ์ˆ˜๊ฐ€ 3๋ณด๋‹ค ํฌ๋‹ค๋ฉด, 3๋ฒˆ์˜ ์—ฐ์‚ฐ ์•ˆ์— ์ˆ˜์—ด์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ "NO"๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

๋ฐ˜๋Œ€๋กœ, 3๋ฒˆ์˜ ์—ฐ์‚ฐ ์•ˆ์— ์ˆ˜์—ด์„ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, "YES"๋ฅผ ์ถœ๋ ฅํ•œ ํ›„ ์—ฐ์‚ฐ ํšŸ์ˆ˜ K์™€ ๋ณ€๊ฒฝํ•  ์ธ๋ฑ์Šค ๋ฐ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

๋ณ€๊ฒฝํ•  ์ธ๋ฑ์Šค์™€ ๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด, length ๋ฐฐ์—ด์„ ํ™œ์šฉํ•˜์—ฌ LIS์— ํฌํ•จ๋œ ์›์†Œ๋“ค์„ ์—ญ์ถ”์ ํ•œ๋‹ค.

length[i]๋Š” A[i]๊ฐ€ LIS์—์„œ ๋ช‡ ๋ฒˆ์งธ ์š”์†Œ์ธ์ง€ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ, ์ด๋ฅผ ์—ญ์ˆœ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ฉฐ  LIS ์›์†Œ๋“ค์„ ์ €์žฅํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ตฌํ•œ LIS ์›์†Œ์™€ ์›๋ž˜ ๋ฐฐ์—ด์„ ๋น„๊ตํ•˜์—ฌ, LIS์— ์†ํ•˜์ง€ ์•Š์€ ์›์†Œ๋“ค์„ ์ฐพ์•„ ์ ์ ˆํ•œ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

 

๋ฐฐ์—ด์„ ์—ญ์ˆœ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ฉฐ,

ํ˜„์žฌ ์›์†Œ A[i]๊ฐ€ LIS์˜ ํ•ด๋‹น ์œ„์น˜ ๊ฐ’๊ณผ ๊ฐ™๋‹ค๋ฉด ๊ทธ๋Œ€๋กœ ๋‘”๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด, ๋ฐ”๋กœ ๋‹ค์Œ ์›์†Œ(A[i+1])๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์˜ค๋ฆ„์ฐจ์ˆœ์„ ์œ ์ง€ํ•œ๋‹ค.

 

๋ณ€๊ฒฝ๋œ ์—ฐ์‚ฐ์„ ๊ธฐ๋กํ•˜์—ฌ ์ถœ๋ ฅํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์œ„ ํ’€์ด๋ฅผ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

โœ” ์ตœ์ข… ์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ : 41904KB
์‹œ๊ฐ„ : 304ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    static int n;
    static int[] A, length;
    static final int MAX = 1000000000;
    static final int INF = Integer.MAX_VALUE;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine()); // ์ˆ˜์—ด์˜ ๊ธธ์ด
        A = new int[n+1]; // ์ˆ˜์—ด
        length = new int[n]; // ๊ฐ ์›์†Œ๊ฐ€ LIS์˜ ๋ช‡ ๋ฒˆ์งธ ์œ„์น˜์ธ์ง€ ์ €์žฅ
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            A[i] = Integer.parseInt(st.nextToken());
        }
        A[n] = MAX;

        // ์—ฐ์‚ฐ ํšŸ์ˆ˜ ๊ตฌํ•˜๊ธฐ
        int lisCnt = getLis();
        int k = n - lisCnt; // ์—ฐ์‚ฐ ํšŸ์ˆ˜

        // 3๋ฒˆ์˜ ์—ฐ์‚ฐ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ์„ ๋งŒ๋“ค ์ˆ˜ ์—†์Œ
        if (k > 3) {
            System.out.println("NO");
            return;
        }

        // 3๋ฒˆ์˜ ์—ฐ์‚ฐ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
        StringBuilder sb = new StringBuilder();
        sb.append("YES").append("\n").append(k).append("\n");

        int cnt = lisCnt;
        int[] lis = new int[n];
        for (int i = n-1; i >= 0; i--) {
            if (length[i] == cnt) {
                lis[cnt--] = A[i];
            }
        }

        cnt = lisCnt;
        for (int i = n-1; i >= 0; i--) {
            if (A[i] == lis[cnt]) {
                cnt--;
                continue;
            }

            int x = A[i+1];
            sb.append(i+1).append(" ").append(x).append("\n");
            A[i] = x;
        }

        System.out.println(sb.toString());
    }

    private static int getLis() {
        int[] lis = new int[n+1];
        int len = 0, idx;

        Arrays.fill(lis, INF);
        lis[0] = 0;

        for (int i = 0; i < n; i++) {
            idx = binarySearch(0, len+1, A[i], lis);
            lis[idx] = A[i];
            length[i] = idx;
            len = Math.max(len, idx);
        }

        return len;
    }

    private static int binarySearch(int start, int end, int target, int[] lis) {
        int mid;
        while (start < end) {
            mid = start + (end-start) / 2;
            if (lis[mid] <= target) start = mid+1;
            else end = mid;
        }

        return end;
    }
}

 

์–ด๋ ต๋‹ค.. ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค.. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ํ’€์—ˆ๋Š”๋ฐ๋„ ์ดํ•ด๊ฐ€ ์•ˆ ๊ฐ€์„œ ํž˜๊ฒน๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‹ค...
๋ธ”๋กœ๊ทธ์— ํฌ์ŠคํŒ…ํ•˜๋ ค๊ณ  ๋‹ค์‹œ ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ํ’€์ด ๊ณผ์ •์„ ์ ์œผ๋ฉด์„œ ๋งŽ์ด ์ •๋ฆฌ๋์ง€๋งŒ
์ผ์ฃผ์ผ ๋’ค์— ๊ผญ ๋‹ค์‹œ ํ’€์–ด๋ด์•ผ์ง€... ๐Ÿ˜‚๐Ÿ˜ญ

 

 

 

 

 

๐Ÿ“ƒ reference