๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ’ป Computer Science/- Data Structure, Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜ PS] ๋ฐฑ์ค€11053๋ฒˆ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด ์ž๋ฐ” ๋ฌธ์ œ ํ’€์ด

by Wonit 2021. 1. 29.

๋ฌธ์ œ

ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ๋ฐฑ์ค€์˜ 11053๋ฒˆ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด ์˜ ์ ‘๊ทผ๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ ๊ธ€ ์ž…๋‹ˆ๋‹ค.
์ •๋‹ต ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์‹œ๋ ค๋ฉด solve url ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋จผ์ € ์ƒ๊ฐํ•ด๋ณด์ž.

ํ•ด๊ฒฐ๋ฒ•

ํ•ด๋‹น ๋ฌธ์ œ๋Š” 2์ค‘ ๋ฐ˜๋ณต DP, ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ DP, ์ด๋ถ„ ํƒ์ƒ‰, ์™„์ „ ํƒ์ƒ‰๋“ฑ ๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ก ์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์œ ๋ช…ํ•œ ๋ฌธ์ œ์ด๋‹ค.

 

๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด, Longest Increasing Sub Sequence, LIS ๋ผ๊ณ  ํ•œ๋‹ค.

 

๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•ด๋ณด์ž.

 

๋ฐฐ์—ด arr = {10, 20, 10, 30, 20, 50}; ์ด ์žˆ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ์—ฌ๊ธฐ์„œ LIS๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋œ๋‹ค.


arr = 10 20 10 30 20 50

 

์ด๊ฒƒ์„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 2๊ฐ€์ง€์˜ ํŠธ๋ฆญ์ด ํ•„์š”ํ•˜๋‹ค.

 

  1. ํ˜„์žฌ ๊ฒ€์‚ฌํ•˜๋Š” ์ˆ˜์˜ ๊ฐ’์ด ์ „์˜ ๊ฐ’๋ณด๋‹ค ์ฆ๊ฐ€ํ•˜๋Š”๊ฐ€
  2. ํ˜„์žฌ ๊ฒ€์‚ฌํ•˜๋Š” ์ˆ˜์˜ ๊ฐ’์ด ์–ผ๋งŒํผ ์ฆ๊ฐ€ํ–ˆ๋Š”๊ฐ€

์ด ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ด๋ฒˆ ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์ด๋‹ค

์ ‘๊ทผ๋ฒ•

์šฐ๋ฆฌ๋Š” ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ arr[index]์— ๊ฐ’์ด ์–ผ๋งˆ๋‚˜ ๊ธด ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์ธ์ง€ ์•Œ๊ธฐ ์œ„ํ•ด dp ํ…Œ์ด๋ธ”์„ ํ•˜๋‚˜ ์ƒ์„ฑํ•  ๊ฒƒ์ด๋‹ค.

 

ํ˜„์žฌ ๊ฒ€์‚ฌํ•˜๋Š” ์ˆ˜์˜ ๊ฐ’์ด ์ „์˜ ๊ฐ’๋ณด๋‹ค ์ฆ๊ฐ€ํ•˜๋Š”๊ฐ€

๊ธธ์ด๊ฐ€ 5์ธ arr ์˜ 4๋ฒˆ์งธ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

 

๊ทธ๋Ÿผ ์šฐ๋ฆฌ๋Š” arr[0] ~ arr[2] ๊นŒ์ง€๋ฅผ 3๋ฒˆ์งธ ์ธ๋ฑ์Šค์™€ ๋น„๊ตํ•ด์•ผ ํ•œ๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ 2์ค‘ for๋ฌธ์ด ํ•„์š”ํ•˜๋‹ค.

ํ˜„์žฌ ๊ฒ€์‚ฌํ•˜๋Š” ์ˆ˜์˜ ๊ฐ’์ด ์–ผ๋งŒํผ ์ฆ๊ฐ€ํ–ˆ๋Š”๊ฐ€

์ด ๊ฒƒ์€ ์กฐ๊ฑด๋ฌธ์œผ๋กœ ๋ฝ‘์„ ์ˆ˜ ์žˆ๋‹ค.

 

์šฐ์„  ์ฆ๊ฐ€ ํ–ˆ๋Š”๊ฐ€์— ๋Œ€ํ•œ ์กฐ๊ฑด์€ ๊ฐ„๋‹จํžˆ ํ˜„์žฌ ์ธ๋ฑ์Šค > j๋ฒˆ์จฐ ์ธ๋ฑ์Šค ๋กœ ๊ฒ€์ฆํ•˜๋ฉด ๋˜์ง€๋งŒ ์–ผ๋งŒํผ ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ๋Š”์ง€๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค.

 

์‚ฌ์‹ค ์ด๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค.

 

  1. dp[n] < dp[i] + 1
  2. d[n] = Math.max(d[n], d[i] + 1)

์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ํ˜„์žฌ ๊ฒ€์‚ฌํ•˜๋Š” ์ธ๋ฑ์Šค๋ณด๋‹ค ์ž‘์€ ์ˆ˜์˜ dp ํ…Œ์ด๋ธ”์—์„œ ํ•˜๋‚˜์”ฉ ์ ์ง„์ ์œผ๋กœ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ์˜ˆ๋กœ ๋“ค์ž๋ฉด 10 20 10 30 ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ 30์€ 3์ฆ๊ฐ€ ์ˆ˜์—ด์ด๋‹ค.


๊ทธ๋Ÿผ 30์ด๋ผ๋Š” ์ˆ˜๊ฐ€ ์žˆ๋Š” ์ธ๋ฑ์Šค์— ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.


10(์ฆ๊ฐ€ ์ˆ˜์—ด ๊ธธ์ด: 1) 20(2) 9(1) 30(?) ์ƒํ™ฉ์—์„œ ์ฒซ ๋ฒˆ์จฐ ์ธ๋ฑ์Šค์ธ 10์€ 30๋ณด๋‹ค ์ž‘์œผ๋‹ˆ 30์˜ ์ฆ๊ฐ€ ์ˆ˜์—ด ๊ธธ์ด๋Š” 1์ด ๋˜๊ณ , 2๋„ ๋งˆ์ฐฌ๊ฐ€์ง€ 2๊ฐ€ ๋œ๋‹ค.


ํ•˜์ง€๋งŒ ๊ทธ ๋‹ค์Œ ์ธ๋ฑ์Šค์ธ 9์˜ ์ฆ๊ฐ€ ์ˆ˜์—ด์€ 1์ธ ๊ธธ์ด์ด๋‹ค.


์—ฌ๊ธฐ์„œ ๊ธฐ์กด์— ์žˆ๋˜ 10, 20 ์ธ๋ฑ์Šค์˜ ์ฆ๊ฐ€ ๊ธธ์ด๋ณด๋‹ค 9์ธ ์ฆ๊ฐ€ ๊ธธ์ด๊ฐ€ ๋” ์ž‘์œผ๋ฏ€๋กœ ๋” ํฐ 10, 20 ์ธ๋ฑ์Šค ๊ธธ์ด๋กœ ํฌํ•จ์‹œํ‚ค๋ฉด ๋œ๋‹ค.


์ด ๊ฒƒ์„ Math.max() ๋ฉ”์„œ๋“œ๋กœ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ •๋‹ต ์ฝ”๋“œ

์œ„์—์„œ ๋งํ•œ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ• ๋ชจ๋‘๋กœ ํ’€์–ด๋ณด๊ฒ ๋‹ค.

์ฒซ๋ฒˆ์จฐ ํ’€์ด

import java.io.*;

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

    String[] nums = br.readLine().split(" ");

    int[] arr = new int[1001];
    int[] dp = new int[1001];

    for(int i = 0; i < nums.length; i++){
      arr[i] = Integer.parseInt(nums[i]);
    }

    dp[0] = 1;

    for(int i = 1; i < n; i++) {
      dp[i] = 1;
      for(int j = 0; j < i; j++){
        if (arr[i] > arr[j]) {
          dp[i] = Math.max(dp[i], dp[j] + 1);
        }
      }
    }
    int answer = 0;
    for(int len: dp) answer = Math.max(len, answer);
    bw.write(String.valueOf(answer));
    bw.flush();
    bw.close();
  }
}

๋‘ ๋ฒˆ์จฐ ํ’€์ด

import java.io.*;

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

    int n = Integer.parseInt(br.readLine());
    int[] arr = new int[1001];
    int[] dp = new int[1001];

    String[] nums = br.readLine().split(" ");
    for (int i = 0; i < nums.length; i++) {
      arr[i] = Integer.parseInt(nums[i]);
    }

    dp[0] = 1;

    for (int i = 1; i <= n; i++) {
      dp[i] = 1;
      for (int j = 0; j < i; j++) {
        if(arr[i] > arr[j] && dp[i] < dp[j] + 1) {
            dp[i] = dp[j] + 1;
        }
      }
    }
    int answer = 0;
    for (int i = 0; i < n; i++) {
      answer = Math.max(dp[i], answer);
    }
    bw.write(String.valueOf(answer));
    bw.flush();
    bw.close();
  }
}

 

๋‘ ํ’€์ด ๋ชจ๋‘ ๋…ผ๋ฆฌ๊ฐ€ ๊ฐ™์€ n^2 ์ด๋ผ ์‹œ๊ฐ„์€ ๋™์ผํ•˜๊ฒŒ 104ms ์˜€๋‹ค.


๋ฌธ์ œ ํšŒ๊ณ 

ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ์ฒ˜์Œ ๋ณธ ๊ฒƒ์€ ์•„๋งˆ ์†Œํ”„ํŠธ์›จ์–ด ๋งˆ์—์ŠคํŠธ๋กœ 11๊ธฐ์˜€์„ ๊ฒƒ์ด๋‹ค.
๊ทธ๋•Œ ๋‹น์‹œ๋Š” ์ •๋ ฌ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ํ†ต๊ณผ ๋๋Š”์ง€ ํžˆ๋“  ์ผ€์ด์Šค๋Š” ๋งž๋Š”์ง€ ์กฐ์ฐจ ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜๋‹ค.
ํ•˜์ง€๋งŒ ์ด์ œ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ํ‹€๋ ธ์„ ๊ฒƒ ๊ฐ™๋‹ค.

์ •๋‹ต ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์‹œ๋ ค๋ฉด solve url ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€