1. LIS๋?
1-1. ๋ถ๋ถ ์์ด์ด๋ ๋ฌด์์ธ๊ฐ?
์์ด์ ์๊ฐ ํ๋์ ์ด๋ก ๋์ด๋ ํํ๋ฅผ ๋ปํ๋ค. (ํ๊ตฐํ๋ ๊ตฐ์ธ์ ๋ ์ฌ๋ ค๋ณด๋ผ!) ์ฌ๊ธฐ์ ๋ถ๋ถ์์ด์ด๋ ์ฃผ์ด์ง ์์ด์ ์ผ๋ถ ํญ์ ์๋ ์์๋๋ก ๋์ดํ์ฌ ์ป์ ์ ์๋ ์์ด ์ ๋ปํ๋ค. ๋ง์ฝ ์ ์ฒด ์์ด S ๊ฐ {1,2,3,4,5,6,7,8,9,10}์ด๋ผ๋ฉด {1}, {2,4,6,8,10}, {2,4,6}, {8,9,10} ๋ชจ๋ S์ ๋ถ๋ถ ์์ด์ด ๋๋ค. ํน์ ํ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ถ๋ถ ์์ด์ด ์ ์ฒด ์์ด ์์์ ์กด์ฌํ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด S์์ ์ง์๋ก ์ด๋ฃจ์ด์ง ๋ถ๋ถ ์์ด์ {2,4,6,8,10}, {2,4,6} ๋ฑ๋ฑ์ด ํด๋น๋ ๊ฒ์ด๋ค. ๊ฐ์ฅ ๊ธด ์ง์๋ก ์ด๋ฃจ์ด์ง ๋ถ๋ถ ์์ด์ {2,4,6,8,10}์ด ๋ ๊ฒ์ด๋ค. 7๋ณด๋ค ํฐ ์์๋ก ์ด๋ฃจ์ด์ง ๋ถ๋ถ์์ด์ {8,9,10}์ด ๋ ๊ฒ์ด๋ค.
1-2. ๊ทธ๋ ๋ค๋ฉด LIS ์๊ณ ๋ฆฌ์ฆ์ด๋?
์ ์ฒด ์์ด S๊ฐ ์ฃผ์ด์ก์ ๋, LIS๋ฅผ ๊ตฌํ๋ฉด ๋๋ค. LIS์ ๊ธธ์ด ํน์ ๊ทธ ๋ด์ฉ๋ฌผ์ ๊ตฌํด์ผ ํ๋ ๊ฒฝ์ฐ๋ ์๋ค. ํน์ ์ด๋ก ์ ๋จผ์ ๊ณต๋ถํ์ง ์๊ณ , ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๊ณ ์ถ์ ์ฌ๋์ด ์๋ค๋ฉด, ๋ฐ์ ๋ํ ๋ฌธ์ ๋ค์ ๋งํฌ๋ฅผ ๋ค์ด๊ฐ์ ๋ถ๋ชํ๊ณ ์ค๊ธธ ๋ฐ๋๋ค. (ํฐ์๋ฆฌ ์๋ฆฌ๋ ๋ฌผ๊ณต์ ํค๋ฉ์ ํ๋ค!)
(๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด ์๋ฆฌ์ฆ๋ ๋ชจ๋ LIS ๋ฌธ์ ์ด๋ค. ์ค๋ฒ ๋ฌธ์ ๋ ์ ํ์ด์๋ด์ ์ถ์ฒ์ ๋ชป ํ๊ฒ ๋ค!)
2. ๊ตฌํ
2-1. DP๋ก ๊ตฌํ
DP๋ ‘๋๋ํ ์์ ํ์’์ ๋งํ๋ค. ์ฌ๊ธฐ์ ์์ ํ์ ๋ค์ ๋๋ํ์ ๋ถ์ธ ์ด์ ๋ DP๋ ์ด๊ธฐ ์ฃผ์ด์ง ๊ฐ์์ ์ด๋ ํ ๊ท์น์ฑ์ ์ด์ฉํ์ฌ, ์ฐ๋ฆฌ๊ฐ ๋๋ฌํด์ผํ๋ ๊ฐ์ ์์ ํ์๋ณด๋ค ๋น๊ต์ ์์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ฐพ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฌ๊ธฐ์ ์ด ๊ท์น์ฑ์ ์ํ ๊ณต์ ํํ๋ก ํํํ ๊ฒ์ ์ ํ์ ์ด๋ผ๊ณ ํ๋ค. ์ DP ์ค๋ช ์ ๋์ค์ ๋ ํ๊ธฐ๋ก ํ๊ณ , LIS์ DP๋ฅผ ์ ์ฉํด๋ณด๊ฒ ๋ค. ์ฐ๋ฆฌ๊ฐ ํธ๋ ๋ฌธ์ ๊ฐ LIS์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ผ๊ณ ํ์. (๊ฑฐ์ ๋ชจ๋ LIS๋ฌธ์ ์ ์๊ตฌ์ฌํญ์ LIS ๊ธธ์ด ๊ตฌํ๊ธฐ๊ฐ ๊ธฐ๋ณธ์ด๋ค! ) ๋จผ์ ์ฃผ์ด์ง ์์ด์ ๋ฐฐ์ด ํํ๋ก ํํํด๋ณด์. ํด๋น ๋ฐฐ์ด์ arr์ด๋ผ๊ณ ํ ๋,
index
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
value
|
3
|
4
|
5
|
6
|
2
|
3
|
1
|
7
|
4
|
3
|
5
|
6
|
7
|
์ด๋ dp๋ผ๋ ๋ฐฐ์ด๋ ๋ง๋ค์ด ๋ณด๊ฒ ๋ค. dp[i]๋ arr[i]๋ฅผ ๋งจ ๋ ๊ฐ์ผ๋ก ๊ฐ์ง ๋ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด์ ๊ธธ์ด๋ฅผ ๊ฐ์ผ๋ก ๊ฐ์ง๋ค. ํ๋ก ํํํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
i
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
arr[i]
|
3
|
4
|
5
|
6
|
2
|
3
|
1
|
7
|
4
|
3
|
5
|
6
|
7
|
dp[i]
|
1
|
2
|
3
|
4
|
1
|
2
|
1
|
5
|
3
|
2
|
4
|
5
|
6
|
i๊ฐ 4์ผ ๋๋ฅผ ๋ณด๋ฉด arr[4] = 6์ธ๋ฐ ํด๋น arr[4]๋ฅผ ๋งจ ๋๊ฐ์ผ๋ก ๊ฐ์ง๋ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด์ {3,4,5,6}์ผ๋ก dp[4] =6 ์ด๋ค. i = 7 ์ผ๋๋ arr[7] = 1 ์ด๊ณ arr[7]์ ๋๊ฐ์ผ๋ก ๊ฐ์ง๋ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ฐ์ 1์ด๋ค. arr[i]์ ๊ฐ์ด ๊ฐ๋๋ผ๋, ์์น์ ๋ฐ๋ผ ์ ๋ถ ๋ค๋ฅด๊ฒ ์๊ฐํด์ผํ๋ค. arr[i]๋ ์ ์ผ ๋ฌด์ดํ๋ค. i = 1 ์ผ๋, i = 6 ์ผ๋, arr[i] ๊ฐ์ ์ ๋ถ 3์ด์ง๋ง, ์์น๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ง๋ค ์ ์๋ ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด ๊ฐ์ด ๋ค๋ฅด๋ค. ์ฐ๋ฆฌ๋ ํด๋น dp์ ๊ฐ ์ค ์ ์ผ ํฐ ๊ฐ์ ๊ตฌํ๋ฉด ๋๋ค. ํด๋น ๊ฐ์ด ์ ์ฒด ์์ด์์ ๊ฐ์ง ์ ์๋ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด์ ๊ธธ์ด์ด๋ค. ์ฌ๊ธฐ์๋ dp[13] = 6 ์ด LIS์ ๊ธธ์ด๊ฐ ๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ํด๋น dp๋ฅผ ๊ตฌํ๋ ์ ํ์์ ๋ฌด์์ผ๊น? ๋ง์ฝ dp[i]๋ฅผ ๊ตฌํ๋ค๋ฉด, ๋จผ์ arr[0] ~ arr[i-1]์์ arr[i]๋ณด๋ค ์์ ๊ฐ์ ์ฐพ๋๋ค. ๊ทธ ์ค์์ dp์ ๊ฐ์ด ์ ์ผ ํฐ ๊ฐ์ ์ฐพ์ผ๋ฉด ๋๋ค. ๋ง์ฝ dp[x]๊ฐ ํด๋น ๋ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ค๋ฉด dp[x]๋ arr[i]๋ฅผ ์ถ๊ฐํ์ ๋, ๋ง๋ค ์ ์๋ ๊ฐ์ฅ ๊ธด ๋ถ๋ถ ์์ด์ด ๋๋ค. ๋ฐ๋ผ์ ๊ณต์์
if(i == 1) {// ๋ฐฐ์ด์ ๋งจ ์ฒ์๊ฐ์ ์กฐํํ ๊ฒฝ์ฐ
dp[i] = 1}
else{
for(int j = 1; j <=i; j++){
if(arr[i] > arr[j]){
dp[i] = Math.max(dp[i], dp[j]+1);
}
}
}
๊ฐ ๋๋ค. (์ฌ์ค ์ ํ์์ ์์ ์ํ๊ณต์์ผ๋ก ํํํด์ผํ๋๋ฐ, ํด๋น LIS์ ๊ฒฝ์ฐ ์ ํ์์ ์ฐพ๊ธฐ๊ฐ ์ด๋ ค์ ๊ณ , ๊ตฌ์ํ๊ธฐ๋ ๋ง๋ง์น ์์๋ค. ์ฐพ์ผ๋ฉด ์ฐ๋ฝ ๋ฐ๋๋ค.)
DP๋ฅผ ์ด์ฉํ LIS ํ์ด๋ ํ๋์ dp[i] ๋ฅผ ๊ตฌํ ๋๋ง๋ค arr ๋ฐฐ์ด์ i๋ณด๋ค ์์ ์ธ๋ฑ์ค ๋ฒ์๊น์ง ์น ๋ค ๋์์ผ ํ๋ค. ๊ทธ๋์ ์ต์ ์ ์๊ฐ ๋ณต์ก๋๋ O(N^2)๊ฐ ๋์จ๋ค.
2-2. ์ด๋ถ ํ์์ผ๋ก ๊ตฌํ
์ด๋ถํ์ ๊ตฌํ์ ์ฐ๋ฆฌ๊ฐ ์กฐ์ํ๋ ๋ฐฐ์ด์ ๋ค๋ฅธ ์๋ฏธ๋ฅผ ๋ด๋๋ค. ์ ์ฃผ์ด์ง ์ ์ฒด ์์ด์ ๋๊ฐ๋ค๊ณ ํ๊ฒ ๋ค.
index
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
value
|
3
|
4
|
5
|
6
|
2
|
3
|
1
|
7
|
4
|
3
|
5
|
6
|
7
|
์ด๋ ์ด๋ถํ์์ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋ฐฐ์ดD๋ฅผ ํ๋ ๋ ๋ง๋ ๋ค.
i
|
1
|
2
|
3
|
4
|
5
|
6
|
D[i]
|
1
|
3
|
4
|
5
|
6
|
7
|
D์ ๋ป์ ๋ค์๊ณผ ๊ฐ๋ค. i๋ค์ ํด๋น ์ ์ฒด ์์ด์์ ๊ตฌํ ์ ์๋ ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด์ด๋ค. D[i]๋ ํด๋น ๋ถ๋ถ ์์ด์ ๋งจ ๋ ๊ฐ์ด ๋ ์ ์๋ ์ ์ค ์ต์๊ฐ์ด๋ค. ์ต์๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ ์ฒด์์ด S๋ฅผ ์ํํ ์๋ก ๊ฐฑ์ ๋๋ค. ๋งจ ์ฒ์์ D[1]์ ๋ค์๊ณผ ๊ฐ์์ ๊ฒ์ด๋ค.
i
|
1
|
2
|
3
|
4
|
5
|
6
|
D[i]
|
3
|
(์์ง ๋ง๋ค์ด์ง์ง ์์)
|
(์์ง ๋ง๋ค์ด์ง์ง ์์)
|
(์์ง ๋ง๋ค์ด์ง์ง ์์)
|
(์์ง ๋ง๋ค์ด์ง์ง ์์)
|
(์์ง ๋ง๋ค์ด์ง์ง ์์)
|
๊ทธ๋ฆฌ๊ณ i = 4๊น์ง ๊ฐ๋ฉด
i
|
1
|
2
|
3
|
4
|
5
|
6
|
D[i]
|
3
|
4
|
5
|
6
|
(์์ง ๋ง๋ค์ด์ง์ง ์์)
|
(์์ง ๋ง๋ค์ด์ง์ง ์์)
|
์ด ๋ ๊ฒ์ด๊ณ , i = 5 ์ผ๋,
i
|
1
|
2
|
3
|
4
|
5
|
6
|
D[i]
|
2
|
4
|
5
|
6
|
(์์ง ๋ง๋ค์ด์ง์ง ์์)
|
(์์ง ๋ง๋ค์ด์ง์ง ์์)
|
D[1]์ด ๊ฐฑ์ ๋๋ค. ์๋ํ๋ฉด arr[5] = 2 ์ด๊ณ ํด๋น ๊ฐ์ ๋ ๊ฐ์ผ๋ก ๊ฐ์ง๋ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ 1์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ํ ์๋์ D[1] ๊ฐ๋ณด๋ค ์์ผ๋ฏ๋ก ๊ฐฑ์ ๋๋ค. ์ด๋ฐ์์ผ๋ก ๊ฐ์ด ์ญ ๊ฐฑ์ ๋๊ณ , arr์ ๋ง์ง๋ง ๊ฐ๊น์ง ์ํํ๋ฉด ๋ฐฐ์ด D๊ฐ ์์ฑ๋๋ค. ์ด๋ ๋ฐฐ์ด D์ ๋ง์ง๋ง ์ธ๋ฑ์ค์ ๊ฐ ์ฆ ๋ฐฐ์ด D์ ๊ธธ์ด๊ฐ LIS์ ๊ธธ์ด๊ฐ ๋๋ค. D[i]๋ฅผ ์ต์๊ฐ์ผ๋ก ๊ฐฑ์ ํ๋ ์ด์ ๋ ๋์ค์ ํด๋น ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ด ๋์ฌ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ฐฑ์ ์๋ ์ด๋ถํ์์ด ์ฐ์ธ๋ค. ํ์ฌ 9๋ฒ์งธ๋ฅผ ์กฐํํ๊ณ arr[9] = 4 ์ด๋ค. ํ์ฌ ๋ฐฐ์ด D๋ ์๋์ ๊ฐ๋ค.
i
|
1
|
2
|
3
|
4
|
5
|
6
|
D[i]
|
3
|
4
|
5
|
6
|
7
|
(์์ง ๋ง๋ค์ด์ง์ง ์์)
|
๊ทธ๋ฌ๋ฉด arr[9] = 4๋ ํด๋น D ๊ฐ๋ค ์ฌ์ด์์ ์ด๋ถํ์์ด ์งํ๋๋ค. 4๋ D[2]์ D[3] ์ฌ์ด์ ๊ฐ์ด๋ฏ๋ก ํด๋น ์์น๊น์ง ๊ฐ ๊ฒ์ด๋ค. ํ์ง๋ง D[2]๋ณด๋ค arr[9]๊ฐ ์์ง ์์ผ๋ฏ๋ก ๊ฐฑ์ ์ ์ด๋ฃจ์ด์ง์ง ์๋๋ค. ์ด์ ๋ค์ ๊ฐ์ ํ์ธํ๋ฉฐ ๋ฐฐ์ด ์ ์ฒด๋ฅผ ์ํํ๋ค. ์ด๋ถํ์์ ๊ฒฝ์ฐ์๋ DP ํ์ด์ฒ๋ผ ๋ฐฐ์ด์ ๊ฐ ํ๋ํ๋ ์ฐพ๊ธฐ ์ํด ๊ทธ์ ๊น์ง์ ๋ชจ๋ arr๊ฐ์ ์ํํ๋ ์๊ฐ ๋ญ๋น๋ฅผ ํ์ง ์๋๋ค. ํด๋น ์ํ๋ ์ด๋ถํ์์ด ํด๊ฒฐํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์ต์ ์ ์๊ฐ ๋ณต์ก๋๋ ์กฐ๊ธ ๋ ๊ฐ์ ๋์ด์ O(N * logN) ์ด๋ค.