๐Ÿ“– [๋ฐฑ์ค€์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด] Q.11722 ๊ฐ€์žฅ ๊ธด ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด ๋ฌธ์ œ ํ’€์ด - java

๐Ÿ“– ๋ฌธ์ œ

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

์ˆ˜์—ด A๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ€์žฅ ๊ธด ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆ˜์—ด A = {10, 30, 10, 20, 20, 10} ์ธ ๊ฒฝ์šฐ์— ๊ฐ€์žฅ ๊ธด ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์€

A = {10, 30, 10, 20, 20, 10} ์ด๊ณ , ๊ธธ์ด๋Š” 3์ด๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด A์˜ ํฌ๊ธฐ N (1 โ‰ค N โ‰ค 1,000)์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„์—๋Š” ์ˆ˜์—ด A๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ๋Š” Ai๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค Ai โ‰ค 1,000)

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด A์˜ ๊ฐ€์žฅ ๊ธด ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ” ์ ‘๊ทผ๋ฒ•

boj Q.11722 ๊ฐ€์žฅ ๊ธด ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด (LIS)๊ณผ ๋น„์Šทํ•œ ์œ ํ˜•์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ํ’€์ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š”

์šฐ์„  ๋ชจ๋“  i๋ฒˆ์งธ๊นŒ์ง€์˜ ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์šฐ์„  ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๊ธฐ์ž์‹ ์„ ํฌํ•จํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๋ชจ๋‘ ๊ฐ€์ง€๋ฏ€๋กœ

๊ธธ์ด๋ฅผ ๋ชจ๋‘ 1๋กœ ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.

๊ทธ ํ›„

i๋ฒˆ์งธ๊นŒ์ง€์˜ ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๊ธธ์ด๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด

1๋ฒˆ์งธ๋ถ€ํ„ฐ i ๋ฒˆ์งธ๊นŒ์ง€์˜ ๋ถ€๋ถ„ ์ˆ˜์—ด๋“ค์„ ํ™•์ธํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1๋ฒˆ์งธ๋ถ€ํ„ฐ i ๋ฒˆ์งธ๊นŒ์ง€๋ฅผ j๋กœ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

if (numbers[i] < numbers[j]) {
                    d[i] = Math.max(d[i], d[j] + 1);
                    max = Math.max(d[i], max);
}

๊ฐ์†Œํ•˜๊ธฐ ์œ„ํ•ด j๋ฒˆ์งธ ์ˆซ์ž๊ฐ€ i๋ฒˆ์งธ ์ˆซ์ž๋ณด๋‹ค ์ปค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

j๋ฒˆ์งธ ์ˆซ์ž๊ฐ€ i๋ฒˆ์งธ ์ˆซ์ž๋ณด๋‹ค ํด ๋•Œ

j๋ฒˆ์งธ๊นŒ์ง€์˜ ๋ถ€๋ถ„์ˆ˜์—ด์˜ ๊ธธ์ด+1 ์ด ํ˜„์žฌ i๋ฒˆ์งธ๊นŒ์ง€์˜ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋ณด๋‹ค ๊ธธ๋‹ค๋ฉด

๋” ๊ธด ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด์ด๋ฏ€๋กœ ๊ฐฑ์‹ ํ•ด์ค๋‹ˆ๋‹ค.

๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๊ฐ€ ๊ฐฑ์‹ ๋  ๋•Œ๋งˆ๋‹ค

์ตœ๋Œ“๊ฐ’ max์™€ ๋น„๊ตํ•ด ๊ฐฑ์‹ ํ•ด์ค๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ๋ฒˆ์งธ๊นŒ์ง€์˜ ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๊ฐ€ ๊ตฌํ•ด์ง€๋ฉด

์ตœ๋Œ€ ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ป ์ฝ”๋“œ

package problem.dynamic;
import java.io.*;
import java.util.Arrays;

public class Main_11722 {
    static int n;
    static int[] d;
    static int[] numbers;
    static int max = 1;

    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        input();
        solve();
        bw.write(Integer.toString(max));
        bw.flush();
        bw.close();
    }

    public static void solve() {
        Arrays.fill(d, 1);
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                if (numbers[i] < numbers[j]) {
                    d[i] = Math.max(d[i], d[j] + 1);
                    max = Math.max(d[i], max);
                }
            }
        }
    }

    public static void input() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        numbers = new int[n + 1];
        d = new int[n + 1];
        String temp[] = br.readLine().split(" ");
        for (int i = 1; i <= n; i++) {
            numbers[i] = Integer.parseInt(temp[i - 1]);
        }
        br.close();
    }
}

Written on February 24, 2021