๐Ÿ“Œ About

lis gif.gif

์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฃผ์–ด์ง„ data list์—์„œ ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด ์ค‘ ๊ฐ€์žฅ ๊ธด ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ ์ด๋ถ„ ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒ์ƒ‰ํ•˜๋ฉฐ O(NlogN)์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.

๐Ÿ“Œ Algorithm

Step 0. ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ์ €์žฅํ•  List์™€ ์ฃผ์–ด์ง„๋ฅผ data ๋ฐฐ์—ด array๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

์ด ๋•Œ ์ฒซ ๋ฒˆ์งธ ์›์†Œ์˜ ๋น„๊ต๋ฅผ ์œ„ํ•ด ๋ชจ๋“  ์›์†Œ๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ์‚ฝ์ž…ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์–‘์ˆ˜ ์›์†Œ๋“ค๋งŒ ์ฃผ์–ด์ง„๋‹ค๋ฉด List์— 0์„ ์‚ฝ์ž…ํ•œ๋‹ค.

**List<T> list = new ArrayList<>(Collections.singleton(T.MIN_VALUE));**

Step 1. ์ฃผ์–ด์ง„ data array๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ํƒ์ƒ‰ํ•œ๋‹ค.

Step 2. ํƒ์ƒ‰ํ•˜๋Š” data๊ฐ€ list์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด List์— ์‚ฝ์ž…ํ•œ๋‹ค.

Step 3. ํƒ์ƒ‰ํ•˜๋Š” data๊ฐ€ list์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’๋ณด๋‹ค ํฌ์ง€ ์•Š๋‹ค๋ฉด ์ด๋ถ„ ํƒ์ƒ‰์„ ํ•œ๋‹ค.

Step 3-1. ์ด๋ถ„ ํƒ์ƒ‰์€ ํƒ์ƒ‰ํ•œ data๋ณด๋‹ค ํฌ๋ฉด์„œ list์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์ฐพ๋Š” ๊ฒƒ์ด๋‹ค.

Step 3-2. ์ฐพ์€ data์™€ ํ˜„์žฌ ํƒ์ƒ‰ํ•œ data๋ฅผ ๊ต์ฒดํ•œ๋‹ค.

Step 4. ์ตœ์ข…์ ์ธ List๊ฐ€ LIS์˜ ๊ธธ์ด์ด๋‹ค. (์ตœ์ดˆ์— ์‚ฝ์ž…ํ•œ T.MIN_VALUE๋Š” ๋นผ์ค˜์•ผ ํ•œ๋‹ค.)

๐Ÿ“Œ Java Code

public class LIS {

    private final int[] array;

    public LIS(int[] array) {
        this.array = array;
    }

    public int run() {
        List<Integer> list = new ArrayList<>(Collections.singleton(0));
        for (int value : array)
            if (list.get(list.size() - 1) < value) list.add(value);
            else binarySearch(list, value);
        return list.size() - 1;
    }

    private void binarySearch(List<Integer> list, int value) {
        int left = 0, right = list.size() - 1, mid;
        while (left < right) {
            mid = (left + right) / 2;
            if (list.get(mid) >= value) right = mid;
            else left = mid + 1;
        }
        list.set(right, value);
    }
}

๐Ÿ“Œ Example

๋‹ค์Œ๊ณผ ๊ฐ™์€ array๊ฐ€ ์ฃผ์–ด์ง„๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ์‚ฌ์‹ค List ์ฒ˜์Œ์—๋Š” 0์ด ์žˆ์œผ๋‚˜ ์ƒ๋žตํ•˜์˜€๋‹ค.

Untitled

์ดํ›„๋ถ€ํ„ฐ๋Š” Array์˜ ์›์†Œ๋“ค์„ ์ฐจ๋ก€๋Œ€๋กœ ํƒ์ƒ‰ํ•œ๋‹ค.

List๋Š” LIS๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋ฉฐ ์‹ค์ œ LIS๋Š” LIS ๋ฐฐ์—ด์— ์žˆ๋‹ค.

๋งŒ์•ฝ ๋™์ผํ•œ ์ตœ์žฅ ๊ธธ์ด ๋ถ€๋ถ„ ์ˆ˜์—ด์ด๋ผ๋ฉด ์šฐ์„  ํƒ์ƒ‰๋œ LIS๋ฅผ ์„ ํƒํ•œ๋‹ค.


์ฒซ ๋ฒˆ์งธ ์›์†Œ์ธ 10์„ ํƒ์ƒ‰ํ•œ๋‹ค.