์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด (LIS,Longest Increasing Subsequence) ์ด๋?
์ด๋ค ์์์ ์์ด์ด ์ฃผ์ด์ง ๋, ์ด ์์ด์์ ๋ช ๊ฐ์ ์๋ค์ ์ ๊ฑฐํด์ ๋ถ๋ถ ์์ด์ ๋ง๋ค ์ ์๋ค. ์ด๋ ๋ง๋ค์ด์ง ๋ถ๋ถ ์์ด ์ค ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ๊ฐ์ฅ ๊ธด ์์ด์ "์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด"์ด๋ผ๊ณ ํ๋ค. - ๋๋ฌด์ํค ๐ณ
โท ์์๋ฅผ ๋ค์ด๋ณด์.
[ 3, 5, 7, 9, 2, 1, 4, 8]
๋ค์๊ณผ ๊ฐ์ ์์ด์ด ์๋ค๊ณ ํ์. ์ด ์์ด์์ ๋ช ๊ฐ์ ์๋ฅผ ์ ๊ฑฐํด์ ๋ถ๋ถ์์ด์ ๋ง๋ค ์ ์๋ค. ๋ช ๊ฐ์ ์๋ฅผ ์ ๊ฑฐํด์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ด๋ฃจ์ด์ง ์์ด์ ์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ด๋ผ๊ณ ํ์๋๋ฐ, ์ฆ, '๊ณต์ฐจ'๊ฐ ์กด์ฌํ์ง ์์๋ ๋ถ๋ถ์์ด์ด๋ผ๊ณ ๋ณธ๋ค๋ ๊ฒ์ด๋ค. (๊ท์น์ ์ด์ง ์๊ณ ์ค๋ฆ์ฐจ์์ด๋ฉด ๋๋ค๋ ๋ป) ๋ฐ๋ผ์ ์ ์์ด์์ ๋์ถ๋ ์ ์๋ ๋ถ๋ถ์์ด์ ํ ๊ฐ์ง๊ฐ ์๋๋ผ, ๋ช ๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.
[3, 7, 9, 1, 4, 8] -- (5, 2 ์ ๊ฑฐ)
[7, 9, 1, 8] -------- (3, 5, 2, 4 ์ ๊ฑฐ)
[3, 5, 7, 8] -------- (9, 2, 1, 4 ์ ๊ฑฐ)
[1, 4, 8] ----------- (3, 5, 7, 9, 2 ์ ๊ฑฐ)
์ด๋ ๊ฒ ๋์ถ๋ ์ ์๋ ๋ถ๋ถ์์ด ์ค, ์ค๋ฆ์ฐจ์์ด๋ฉด์, ๊ฐ์ฅ ๊ธด ๊ธธ์ด๋ฅผ ๊ฐ๊ณ ์๋ ๋ถ๋ถ์์ด์ด LIS ๋ผ๊ณ ํ๋ค.
๐๐ปโ๏ธ LIS๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ
LIS๋ฅผ ๊ตฌํ๋ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์, DP(๋์ ๊ณํ๋ฒ)๊ณผ ์ด๋ถํ์์ ํ์ฉํ๋ ๋ ๊ฐ์ง์ ๋ฐฉ๋ฒ์ด ์๋ค. ์์ง์ ์ด๋ถํ์์ ๋ํ ์์ ํ ๊ฐ๋ ์ ๊ณต๋ถํ์ง ์์๊ธฐ ๋๋ฌธ์, ์ค๋์ DP๋ฅผ ํ์ฉํ LIS ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด์๋ง ์์๋ณด๊ฒ ๋ค. (์ถํ ์ด๋ถํ์์ ํ์ฉํ LIS ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ก ๋ค๋ฃฐ ์์ ์ด๋ค.)
๐๐ป DP(๋์ ๊ณํ๋ฒ) ์ด์ฉํด์ LIS ๊ตฌํ๊ธฐ : O(N^2)
๋ฐฐ์ด D[i] ๋ i๋ฒ์งธ ์ธ๋ฑ์ค์์ ๋๋๋ ์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ ์๋ฏธํ๋ค. ๋ถ๋ถ์์ด A์ i๋ฒ์งธ ์์๊ฐ ์ด๋ค ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ๋ง์ง๋ง ๊ฐ์ด ๋๊ธฐ ์ํด์๋ A[i]๊ฐ ์ถ๊ฐ๋๊ธฐ ์ ์ฆ๊ฐ ๋ถ๋ถ์์ผ์ ๋ง์ง๋ง ๊ฐ์ด A[i]๋ณด๋ค ์์ ๊ฐ์ด์ด์ผ ํ๋ค. ๋ฐ๋ผ์ A[i]๋ฅผ ๋ง์ง๋ง ๊ฐ์ผ๋ก ๊ฐ์ง๋ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ A[i]๊ฐ ์ถ๊ฐ๋ ์ ์๋ ์ฆ๊ฐ ๋ถ๋ถ ์์ด ์ค ๊ฐ์ฅ ๊ธด ์์ด์ ๊ธธ์ด์ 1์ ๋ํ ๊ฐ์ด ๋๋ค.
โท ๋น ๋ฅธ ์ดํด๋ฅผ ์ํด ์์๋ฅผ ๋ณด์.
[3, 5, 7, 9, 2, 1, 4, 8]
์ด ์์ด์ ํ์ฉํ์ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ดํด๋ณด์. (์๊ณ ๋ฆฌ์ฆ ๊ท์น์ ํ์ฑ์ ์ํด i=0์ ์ถ๊ฐํ๊ณ , i=0์ผ๋ D[0] = 0 ์ด๋ค.)
i=1 ์ผ ๋๋ฅผ ์ดํด๋ณด์. A[1] = 3 ์ด๋ค. 3์ A[0] = 0 ๋ค์ ๋ถ์ ์ ์๋ค. ๋ฐ๋ผ์ D[1] = D[0] + 1 = 1 ์ด๋ค.
i=2์ผ ๋๋ฅผ ๋ณด์. A[2] = 5 ์ด๋ค. 5๋ A[0] = 0, A[1] = 3 ๋ค์ ๋ถ์ ์ ์๋ค. ์ด๋ D[0] = 0, D[1] = 1 ์์ D[1]์ด ๊ฐ์ฅ ํฌ๋ค. ์ด ๋ง์ A[1]=3 ์ ๋ง์ง๋ง ๊ฐ์ผ๋ก ๊ฐ์ง๋ ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๊ฐ ๊ฐ์ฅ ๊ธธ๋ค๋ ๋ป์ด๋ค. A[2]๊ฐ ๊ฐ์ฅ ๊ธด ๋ถ๋ถ ์์ด ๋ค์ ๋ถ๋๊ฒ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐ๋ถ๋ถ์์ด์ด ๋ ์ ์๋ค. ๋ฐ๋ผ์ D[2]=D[1]+1 = 2 ์ด๋ค.
i=3, i=4 ์ผ ๋๋, ์์ ๋์ผํ ๊ท์น์ฑ์ ์ํด ๋ชจ๋ ์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ์์ด์ ๋ง๋ค ์ ์๋ค. ๋ฐ๋ผ์ D[3] = D[2] +1 = 3 ์ด ๋๊ณ , D[4] = D[3]+1 =4 ๊ฐ ๋ ๊ฒ์ด๋ค.
์ ๊ทธ๋ผ ์ด์ i=5 ์ผ ๋๋ฅผ ์ดํด๋ณด์. A[5] = 2 ์ด๋ฏ๋ก, A[0] ๋ค์ ๋ถ์ ์ ์๋ค. ๋ฐ๋ผ์ D[5] = D[0] + 1 = 1์ด ๋๋ค.
i = 6์ผ๋๋ D[6] = 1 ์ด๋ฏ๋ก, ๋ง์ฐฌ๊ฐ์ง๋ก A[0] ๋ค์ ๋ถ์ ์ ์๋ค. ๋ฐ๋ผ์ D[6] = D[0] +1 = 1 ์ด ๋๋ค. i=7์ A[7] = 4 ์ด๋ฏ๋ก, A[1] = 3 ๋ค์ ๋ถ์ ์ ์๋ค. ๋ฐ๋ผ์ D[7] = D[1] + 1 = 2 ๊ฐ ๋๋ค.
๋ง์ง๋ง์ผ๋ก i = 8 ์ผ๋๋, A[3] = 7 ๋ค์ ๋ถ์ ์ ์๊ธฐ ๋๋ฌธ์, D[8] = D[3] +1 = 4 ๊ฐ ๋๋ค.
์ด๋ ๊ฒ ํด์ ๋ฐฐ์ด D ๋ฅผ ๋ชจ๋ ์์ฑ์์ผฐ๋ค. D์ ๊ฐ๋ค ์ค, ๊ฐ์ฅ ํฐ 4๊ฐ ํด๋น ์์ด์ LIS ๊ธธ์ด๊ฐ ๋๋ค. ์ด๋ ๊ฒ DP ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํ๋ค๋ณด๋ฉด, i ๊ฐ์ ์์ด์ด ์์ ๋, i ๋ฒ์ ์ฐ์ฐ์ด ํ์ํ๋ฏ๋ก, O(N^2)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ์ ์ฝ๋ฉํ ์คํธ์์ ํ์ฉํ๊ธฐ ์ํด์ ์ฝ๋ ์์ ๋ฅผ ์์ฑํด๋ณด์. ์ค์ํํธ ์ฝ๋๋ก ๊ตฌํํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
let A = [3, 5, 7, 9, 2, 1, 4, 8]
var D: [Int] = []
for k in 0..<A.count {
D.append(1)
for i in 0..<k+1 {
if A[i] < A[k] {
D[k] = max(D[k], D[i] + 1)
}
}
}
print(D)
์์์ D[i] ๋ i ๋ฒ์งธ ์ธ๋ฑ์ค์์ ๋๋๋ ์ต์ฅ ์ฆ๊ฐ ์์ด์ ๊ธธ์ด๋ฅผ ์๋ฏธํ๋ค. ๊ฐ์ max ๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ ์ ๋ฐ์ดํธ ํด์ฃผ์๋๋ฐ, ์ ๋ฐ์ดํธ ํด์ฃผ๋ ๊ธฐ์ค์ ๋ค์๊ณผ ๊ฐ๋ค.
- i ๋ฒ์งธ ์ธ๋ฑ์ค์์ ๋๋๋ ์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ๋ง์ง๋ง์ A[k]๋ฅผ ์ถ๊ฐํ์ ๋์ LIS ๊ธธ์ด์,
- ์ถ๊ฐํ์ง ์๊ณ ๊ธฐ์กด์ D[k] ๊ฐ
- ๋ ์ค ๋ ํฐ ๊ฐ์ผ๋ก D[k] ๋ฅผ ์ ๋ฐ์ดํธ ํ๋ค.
โ๐ป ์ฐธ๊ณ ์๋ฃ
'Algorithm > Basic' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ์ด๋ถ๊ทธ๋ํ๋? (ํน์ง, ํ์๋ฐฉ๋ฒ) (feat. BFS,DFS) (0) | 2022.05.25 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ๋ฐฑํธ๋ํน์ด๋? (Swift) (feat.DFS/BFS) (0) | 2022.05.23 |
[์๊ณ ๋ฆฌ์ฆ] Dynamic Programming (๋์ ๊ณํ๋ฒ, DP) (feat. Swift ์ค์ํํธ) (0) | 2022.03.03 |
[์๋ฃ๊ตฌ์กฐ] ์คํ, ํ (feat. ํ์ด์ฌ) (0) | 2021.09.13 |
[์๊ณ ๋ฆฌ์ฆ] ํ์ ์๊ณ ๋ฆฌ์ฆ DFS, BFS (0) | 2021.07.23 |