์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด ์๊ณ ๋ฆฌ์ฆ์ ์ฃผ์ด์ง data list์์ ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด ์ค ๊ฐ์ฅ ๊ธด ๋ถ๋ถ ์์ด์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ถ๊ฐ์ ์ผ๋ก ์ด๋ถ ํ์์ ์ฌ์ฉํ์ฌ ํ์ํ๋ฉฐ O(NlogN)์ ์๊ฐ์ด ์์๋๋ค.
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๋ ๋นผ์ค์ผ ํ๋ค.)
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);
}
}
๋ค์๊ณผ ๊ฐ์ array๊ฐ ์ฃผ์ด์ง๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์ฌ์ค List ์ฒ์์๋ 0์ด ์์ผ๋ ์๋ตํ์๋ค.
์ดํ๋ถํฐ๋ Array์ ์์๋ค์ ์ฐจ๋ก๋๋ก ํ์ํ๋ค.
List๋ LIS๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์๋ฃ๊ตฌ์กฐ์ด๋ฉฐ ์ค์ LIS๋ LIS ๋ฐฐ์ด์ ์๋ค.
๋ง์ฝ ๋์ผํ ์ต์ฅ ๊ธธ์ด ๋ถ๋ถ ์์ด์ด๋ผ๋ฉด ์ฐ์ ํ์๋ LIS๋ฅผ ์ ํํ๋ค.
์ฒซ ๋ฒ์งธ ์์์ธ 10์ ํ์ํ๋ค.