Publish:

ํƒœ๊ทธ: , , , , ,

์นดํ…Œ๊ณ ๋ฆฌ:

img_3.png

๋ฌธ์ œ

๋ฌธ์ œ ๋งํฌ

img_3.png

์„ค๋ช…

์–ด๋–ค ์ˆ˜์—ด์ด ์ฃผ์–ด์ง€๊ณ  ์ˆ˜์—ด ๋‚ด์—์„œ ์ˆ˜๋ฅผ ๋ช‡๊ฐœ ๋ฝ‘๋Š”๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์ˆ˜์—ด(LIS)์˜ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ œ

ํ’€์ด (DP)

dp[i] ๋Š” nums[i] ๋ฅผ ๋งˆ์ง€๋ง‰ ์›์†Œ๋กœ ํ•˜๋Š” LIS ์˜ ๊ธธ์ด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ „์ฒด ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ ํ˜„์žฌ ์ธ๋ฑ์Šค๊นŒ์ง€ nums[j] < nums[i] ์ธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ LIS ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์ด๊ธฐ ๋•Œ๋ฌธ์— dp[i] ๋ฅผ ๋‹ค์Œ ๊ธฐ์ค€ ์ค‘ ๋” ๊ธด ๊ธธ์ด๋กœ ๊ฐฑ์‹ ํ•ด ์ค€๋‹ค.

  • j ์ธ๋ฑ์Šค ๊นŒ์ง€ ๊ณ„์‚ฐํ•œ LIS ๋งˆ์ง€๋ง‰์— nums[i] ๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ธธ์ด (dp[j] + 1)
  • ๊ธฐ์กด์˜ dp[i] ๊ฐ’
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
  public int lengthOfLIS(int[] nums) {
    int[] dp = new int[nums.length];
    Arrays.fill(dp, 1);

    int maxLen = 1;
    for (int i = 1; i < nums.length; i++) {
      for (int j = 0; j < i; j++) {    // ํ˜„์žฌ ์ธ๋ฑ์Šค(i) ์ „ ๊นŒ์ง€ ๊ฒ€์‚ฌ
        if (nums[j] < nums[i]) {       // ๊ตฌ๊ฐ„ ๋‚ด์—์„œ ํ˜„์žฌ ์ธ๋ฑ์Šค ๊ฐ’(arr[i]) ๋ณด๋‹ค ์ž‘์œผ๋ฉด LIS ์กฐ๊ฑด ์„ฑ๋ฆฝ
          dp[i] = Math.max(dp[i], dp[j] + 1);    // dp[i] ๊ฐ’ ๊ฐฑ์‹ 
        }
      }
      maxLen = Math.max(maxLen, dp[i]);   // ๊ธฐ์กด LIS ๋ณด๋‹ค ๊ธธ๋ฉด ๊ฐฑ์‹ 
    }
    return maxLen;
  }
}

์ „์ฒด ๋ฐฐ์—ด์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉด์„œ ์ง์ ‘ ์ธ๋ฑ์Šค ๋น„๊ต๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— O(n^2) ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋œ๋‹ค.

ํ’€์ด (์ด๋ถ„ํƒ์ƒ‰)

LIS ๋ฌธ์ œ๋ฅผ ์ด๋ถ„ ํƒ์ƒ‰์œผ๋กœ ํ’€๊ฒŒ๋˜๋ฉด O(n log n) ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ„ DP ๋ฐฉ์‹์—์„  dp[i] ๋ฅผ LIS ์˜ ๊ธธ์ด๋กœ ์ •์˜ํ–ˆ์—ˆ๋Š”๋ฐ, ์ด๋ถ„ ํƒ์ƒ‰ ๋ฐฉ์‹์—์„  lis ๋ฐฐ์—ด์— ํ˜„์žฌ๊นŒ์ง€ ์ฐพ์€ LIS ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.

์ž๋ฐ”์—์„œ Arrays.binarySearch() ๋ฅผ ํ†ตํ•ด ์ด๋ถ„ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ ๊ฐ’์„ ์ฐพ๊ณ ์žํ•˜๋Š” ๋ฐฐ์—ด์„ ๋„˜๊ฒจ์ฃผ๊ณ  ์ˆœ์„œ๋Œ€๋กœ fromIndex, toIndex, key ๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค. key ๊ฐ’์„ lis ์—์„œ ์ฐพ๊ฒŒ๋˜๋ฉด ์ฐพ์€ ์œ„์น˜ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋งŒ์•ฝ ๋ชป์ฐพ๊ฒŒ ๋˜๋ฉด -(insertion point) -1 ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ

์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฝ์ž… ์ง€์ ์ด index 2 ์ธ ๊ฒฝ์šฐ Arrays.binarySearch() ๋Š” -3 ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

1
2
int[] arr = {1, 3, 5, 7};
int pos = Arrays.binarySearch(arr, 4); // returns -3

lis ์— ์‚ฝ์ž… ์œ„์น˜ ๊ทธ๋Œ€๋กœ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด -(pos + 1) ๋ฅผ ํ•˜๊ฒŒ๋˜๋ฉด -(-3 + 1) = 2 ๊ฐ€ ๋œ๋‹ค. ์œ„ ์˜ˆ์‹œ์ฒ˜๋Ÿผ 4๋Š” 2๋ฒˆ์งธ ์ธ๋ฑ์Šค์— ๋“ค์–ด๊ฐ€์•ผ ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
  public int lengthOfLIS(int[] nums) {
    int[] lis = new int[nums.length];
    int length = 0;   // ํ˜„์žฌ lis ๋ฐฐ์—ด์˜ ์œ ํšจ ๊ธธ์ด

    for (int num : nums) {
      int pos = Arrays.binarySearch(lis, 0, length, num);
      if (pos < 0) {    
        pos = -(pos + 1);  // lis ๋ฐฐ์—ด์— ์‚ฝ์ž…ํ•  ์œ„์น˜ ๊ณ„์‚ฐ
      }
      lis[pos] = num;
      if (pos == length) {  
        length++;
      }
    }
    return length;
  }
}

๋งŒ์•ฝ ํ˜„์žฌ lis ๋ฐฐ์—ด์— [0, 1, 3] ์ด ๋“ค์–ด์žˆ๋Š” ์ƒํƒœ์—์„œ num = 2 ์ด๋ฉด pos ๋Š” -3 ์ด ๋˜๊ณ , -(pos + 1) = 2 ๊ฐ€ ๋œ๋‹ค. lis ๋ฐฐ์—ด์€ [0, 1, 2] ๊ฐ€ ๋˜์–ด 3์ด 2๋กœ ๋Œ€์ฒด๋œ๋‹ค. ์ฆ‰, lis ๋ฐฐ์—ด์—” ๊ณ„์†ํ•ด์„œ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

img_3.png

length ๋ณ€์ˆ˜๋Š” lis ๋ฐฐ์—ด์— ๊ฐ’์ด ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€๋ ๋•Œ๋งˆ๋‹ค ๋Š˜์–ด๋‚˜๊ฒŒ ๋œ๋‹ค. ์œ„ dp ๋ฐฉ์‹๊ณผ์˜ ์ฐจ์ด์ ์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด dp ๋ฐฉ์‹์€ ๋ถ€๋ถ„ ์ˆ˜์—ด ์ž์ฒด์—๋Š” ๊ด€์‹ฌ ์—†๊ณ  ๊ทธ ์ˆœ๊ฐ„ ์ˆœ๊ฐ„์˜ LIS ๊ธธ์ด๋งŒ์„ ์ถ”์ ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์ด๋ถ„ํƒ์ƒ‰ ๋ฐฉ์‹์€ ์‹ค์ œ๋กœ LIS ๋ฅผ ๊ตฌ์„ฑํ•ด ๊ฐ„๋‹ค๋Š” ์ ์ด ๋‹ค๋ฅด๋‹ค.

๋ฐฉ๋ฌธํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋Œ“๊ธ€,์ง€์ ,ํ”ผ๋“œ๋ฐฑ ์–ธ์ œ๋‚˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค๐Ÿ˜Š

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ