๐ ์ต์ฅ ์ฆ๊ฐ ์์ด (Longest Increasing Subsequence)
๐ฌ ๋ฌธ์ ์์
๋ค์๊ณผ ๊ฐ์ ์์ด์ด ๋์ด๋์๋ค. ์ด ๋ฐฐ์ด์ ์์๋ฅผ ์ ์งํ๋ฉด์ ํฌ๊ธฐ๊ฐ ์ ์ง์ ์ผ๋ก ์ปค์ง๋ ๊ฐ์ฅ ๊ธด ๋ถ๋ถ์ ์์ด ๊ธธ์ด๋ฅผ ๊ตฌํ์์ค. [ 3, 2, 6, 4, 5, 1 ]
- ์ต์ฅ ์ฆ๊ฐ ์์ด์ 2, 4, 5 ์ด๊ณ , ๊ธธ์ด๋ 3์ด๋ค.
โพ ๋ฐฉ๋ฒ 1
- ํด๋น ์์ด ์์๋ค์ ์ฐจ๋ก๋ก ํ์ธํ๋ ๋ฐฉ๋ฒ
- ํ์ธํ๋ ค๋ ํด๋น ์์
input[i]
์ ์ ์์๋ค(๋ฒ์: j = 0 ~i
)๊ณผ ๋น๊ตํจ
- ์๊ธฐ ์์ ๋ณด๋ค ์์ ๋ ๋์ ํ์ฌ ์ต์ฅ ์ฆ๊ฐ ์์ด ๊ธธ์ด
length[i]
๋ณด๋ค ๋๋ณด๋ค ์์ ์input[j]
์ ์ต์ฅ ์ฆ๊ฐ ์์ด ๊ธธ์ดdml +1์ธ ๊ฐ length[j]+1
๋ ํด ๋ ํฐ ์ ๊ฐฑ์
- ์๊ฐ ๋ณต์ก๋ : O(n^2)
int[] input = {3, 2, 6, 4, 5, 1};
int[] length = new int[6];
for (int i = 0; i < 6; i++) {
lis[i] = 1;
for (int j = 0; j < i; j++) {
if(input[j] > input[i]) continue;
if(length[j] + 1 > length[i]) {
length[i] = length[j] + 1;
}
}
}
for (int i = 0; i < 6; i++) {
System.out.println(length[i]);
}
โพ ๋ฐฉ๋ฒ 2
์ด๋ถ ํ์์ ์ด์ฉํ ๋ฐฉ๋ฒ
- ๊ธธ์ด์ ํด๋น ์์๋ค์ ์ ์ ์์
- ์๊ฐ๋ณต์ก๋ : O(nlogn)
public static void main(String[] args) {
int[] input = {3, 2, 6, 4, 5, 1};
int[] lis = new int[6];
lis[0] = input[0];
int i = 1;
int j = 0;
while (i < 6) {
if (lis[j] < input[i]) {
lis[j + 1] = input[i];
j += 1;
}
else {
int idx = binarySearch(0, j, input[i], lis);
lis[idx] = input[i];
}
i += 1;
}
for (int k = 0; k < 6; k++) {
System.out.println(lis[k]);
}
}
static int binarySearch(int left, int right, int target, int[] lis) {
int mid = 0;
while(left < right) {
mid = (left + right) / 2;
if(lis[mid] < target) left = mid + 1;
else right = mid;
}
return right;
}