๊ธฐ๋ก๋ฐฉ

BOJ_14002 : ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด 4 ๋ณธ๋ฌธ

CodingTest/Java

BOJ_14002 : ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด 4

Soom_1n 2024. 5. 1. 21:48

๐Ÿ‘‰ ๋ฌธ์ œ๋งํฌ



๐Ÿ”ธ ๋ฌธ์ œ ๋ถ„์„ ๐Ÿ”ธ

  • ์ „ํ˜•์ ์ธ ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด (LIS) ๋ฌธ์ œ์ด๋‹ค.
    • LIS์˜ DP ํ’€์ด๋Š” O(n^2) ์ด๊ณ , ์ด๋ถ„ํƒ์ƒ‰ ํ’€์ด๋Š” O(nlogn)์ด๋‹ค.
    • ์—ฌ๊ธฐ์„œ๋Š” n์ด 1000์ด๋ฏ€๋กœ, DP ํ’€์ด๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

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

  • DP ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•œ๋‹ค.
    • DP ๋ฐฐ์—ด์—๋Š” ํ˜„์žฌ ์ธ๋ฑ์Šค๋ฅผ ํฌํ•จํ•ด์„œ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ์ €์žฅํ•œ๋‹ค.
    • ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ, ์ด์ „ ์ธ๋ฑ์Šค๋“ค ์ค‘ DP ๋ฐฐ์—ด ๊ฐ’์˜ ์ตœ๋Œ€๊ฐ’ + 1์„ ์ €์žฅํ•œ๋‹ค.
    • dp[i] = max(dp[i], dp[j] + 1)

๐Ÿ”ธ ์ฝ”๋“œ ๐Ÿ”ธ

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

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

        int N = Integer.parseInt(br.readLine());
        int[] A = new int[N];
        Dp[] dp = new Dp[N];

        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            A[i] = Integer.parseInt(st.nextToken());
            dp[i] = new Dp(1, 0);
        }

        // DynamicProgramming
        int maxVal = 1;
        int maxIdx = 0;
        for (int i = 1; i < N; i++) {
            for (int j = 0; j < i; j++) {
                if (A[j] < A[i] && dp[j].cost + 1 > dp[i].cost) {
                    dp[i].cost = dp[j].cost + 1;
                    dp[i].before = j;
                }
            }
            if (maxVal < dp[i].cost) {
                maxVal = dp[i].cost;
                maxIdx = i;
            }
        }

        // Output
        int[] ans = new int[maxVal];
        int idx = maxVal - 1;
        ans[idx--] = A[maxIdx];

        while (idx >= 0) {
            maxIdx = dp[maxIdx].before;
            ans[idx--] = A[maxIdx];
        }

        StringBuilder sb = new StringBuilder();
        sb.append(maxVal).append('\n');

        for (int i = 0; i < maxVal; i++) {
            sb.append(ans[i]).append(' ');
        }

        bw.write(sb.toString());
        bw.flush();
    }

    private static class Dp {
        int cost, before;

        public Dp(int cost, int before) {
            this.cost = cost;
            this.before = before;
        }
    }
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ์›์†Œ๋“ค๋„ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๊ฐ’๊ณผ ์ด์ „ ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅํ•˜๋Š” Dp ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ–ˆ๋‹ค.
  • LIS์˜ DP ํ’€์ด ์ง„ํ–‰ํ•˜๊ณ , ์ด์ „ ์ธ๋ฑ์Šค๋ฅผ ํƒ์ƒ‰ํ•ด์„œ LIS ์ˆ˜์—ด์˜ ์›์†Œ ๊ฐ’์„ ๊ตฌํ•œ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • ๊ธฐ๋ณธ์ ์ธ LIS์˜ DP ํ’€์ด ๋ฌธ์ œ์—์„œ ์›์†Œ ์ถœ๋ ฅ๊นŒ์ง€ ์กฐ๊ธˆ ์ถ”๊ฐ€๋œ ๋ฌธ์ œ์˜€๋‹ค.
  • LIS๋ฅผ ์ •๋ฆฌํ•ด๋‘” ํฌ์ŠคํŒ…์ด ์žˆ์–ด์„œ ํฌ๊ฒŒ ์–ด๋ ต์ง„ ์•Š์•˜๋Š”๋ฐ, ๋‹ค์‹œ๋ณด๋‹ˆ ์ด๋ถ„ ํƒ์ƒ‰์€ ๊ธฐ์–ต์ด ์ž˜ ์•ˆ๋‚œ๋‹ค.
  • N ์ด 1์ธ ๊ฒฝ์šฐ์˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋ฏธํกํ•ด์„œ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ํ•œ๋ฒˆ ๋‚ฌ๋‹ค.

728x90

'CodingTest > Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

BOJ_1261 : ์•Œ๊ณ ์ŠคํŒŸ  (0) 2024.05.10
BOJ_1339 : ๋‹จ์–ด ์ˆ˜ํ•™  (0) 2024.05.06
BOJ_1922 : ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ  (0) 2024.04.30
BOJ_2573 : ๋น™์‚ฐ  (0) 2024.04.27
BOJ_14499 : ์ฃผ์‚ฌ์œ„ ๊ตด๋ฆฌ๊ธฐ  (0) 2024.04.26