์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ด๋?
์ด๋ค ์์ด์ด ๋์ด๋์ด ์์ ๋, ๊ทธ ๋ฐฐ์ด ์์๋ฅผ ์ ์งํ๋ฉด์ ์ ์ ์ปค์ง๋ ๋ถ๋ถ ์์ด์ ๊ฐ์ฅ ๊ธธ์ด๊ฐ ๊ธด ์์ด์ ๊ตฌํ๋ ๋ฌธ์ .
ex)
3, 1, 5, 2, 4, 6 ์ด๋ผ๋ ์์ด์ด ์์ ๋,
3, 1, 5, 2, 4, 6 --> [1, 2, 4, 6] ์ด๋ผ๋ ํด๋ฅผ ๊ตฌํ ์ ์๊ณ , ๊ธธ์ด๋ 4์ด๋ค.
์ ๊ทผ๋ฒ + Java ์ฝ๋
1. ์์ ํ์
์์ด์ ๋ชจ๋ ๋ถ๋ถ์งํฉ์ ๊ตฌํ ํ, ๊ธธ์ด๊ฐ ๊ธด ์์ด๋ถํฐ ๊ทธ ๋ถ๋ถ์งํฉ์ด ์ฆ๊ฐํ๋ ์์ด์ธ์ง ํ์ธํ๋ค.
์ด ๋ฐฉ๋ฒ์ ๋ถ๋ถ์งํฉ์ ์ ๋ถ ๊ตฌํ๋ Brute-force ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์, ์๊ฐ๋ณต์ก๋๋ O(2^n)์ด๋ผ๊ณ ํ ์ ์๋ค.
ex)
[3, 1, 2, 4, 5, 6] -> [3, 1, 2, 4, 5] , [3, 1, 2, 4, 6] , [3, 1, 2, 5, 6] , ..... -> ๊ธธ์ด๊ฐ 4์ธ ์์ด [1, 2, 4, 6] -> ๊ธธ์ด๊ฐ 3์ธ ์์ด -> ...
2. DP-1
์์ด์ ์กฐํํ๋ฉด์ ํ์ฌ ์์๋ณด๋ค ์์ ์์๋ค์ LIS ์ค ์ ์ผ ํฐ ๊ฐ + 1์ ํ์ฌ LIS์ ์ ์ฅํด์ค๋ค. ์ด๊ฒ ๋ฌด์จ๋ง์ด๋...!
ํ์ฌ ์์๊ฐ ์์ ์๋ ๊ฒ๋ค๋ณด๋ค ์ ์ผ ์ปค์ผ ํ๊ธฐ ๋๋ฌธ์, ์์ ๋ณด๋ค ์์ ๊ฒ์ LIS ๋งจ ๋ค์ ํ์ฌ ์์๋ฅผ ๋ถ์ธ๋ค๋ ๋ป์ผ๋ก ์ดํดํ๋ฉด ํธํ๋ค.
ex)
index : 0 | 1 | 2 | 3 | 4 | 5 |
arr[i] : 3 | 1 | 5 | 2 | 4 | 6 |
LIS[i] : 1 | 1 | 2 | 2 | 3 | 4 |
index=0 : ๋น๊ตํ ์๊ฐ ์์ผ๋๊น -> LIS[0] = 1
index=1 : 1์ด 3๋ณด๋ค ์์ผ๋ฏ๋ก 3 ๋ค์ ๋ชป์ ๋ค. -> LIS[1] = 1
index=2 : 1,3 ๋ค์ ์ค ์ ์์ผ๋ฏ๋ก LIS[0]+1, LIS[1]+1 ์คํ -> LIS[2] = 2
index=3 : 1 ๋ค์ ์ค ์ ์์ผ๋ฏ๋ก LIS[1]+1 -> LIS[3] = 2
index=4 : 3, 1, 2 ๋ค์ ์ค ์ ์์ผ๋ฏ๋ก LIS[0]+1, LIS[1]+1, LIS[3]+1 ์์๋๋ก ์คํํ๋ฏ๋ก ๊ฐ์ฅ ํฐ ๊ฐ+1 ์ ์ฅ -> LIS[4]=3
index=5 : ๋ชจ๋ ์์ ๋ค์ ์ค ์ ์์. LIS[0]+1 ~ LIS[4]+1 ์คํ -> LIS[5]=4
์ด ๋ฐฉ๋ฒ์ LIS์ ๊ธธ์ด๋ง ๊ตฌํ ์ ์๋ค. ๋ ์๊ฐ๋ณต์ก๋๋ ๋ฐ๋ณต๋ฌธ์ ๋๋ฒ ๋๋ฏ๋ก O(n^2)
3. DP-2 Binary Search ํ์ฉ
์ด๊ฑด 2๋ฒ ๋ฐฉ๋ฒ๊ณผ ์ ๊ทผ ๋ฐฉ์์ด ๋ ๋ค๋ฅด๋ค.
C[k] : ๊ธธ์ด๊ฐ k์ธ ์ฆ๊ฐ ์์ด์ ๋ํ์ฌ k ์์น์ ์ฌ ์ ์๋ ๊ฐ ์ค ๊ฐ์ฅ ์์ ๊ฐ์ ์ ์ฅํ๋ค. << ์ด ๊ฐ๋ ์ ์ฌ์ฉํ๋ค.
์ ๊ฐ์ฅ ์์ ๊ฐ์ ์ ์ฅํ๋๋ฉด ๋ค์ ์ค ์ ์๋ ๊ฐ๋ ์์ ๋ค๋ฅธ ํฐ ๊ฐ์ด ์์์ผ๋ฉด ๋ชป ์๊ธฐ ๋๋ฌธ์ด๋ค.. ๋ฌด์จ ๊ฒฝ์ฐ๋๋ฉด
3,1,5,2,4,6์์ C[1]์ด 3์ด๋ผ๋ฉด C[2]์ 2๊ฐ ์๋ ์ฌ ์ ์๋๋ฐ ๋ชป ์ค๋ ๊ฒฝ์ฐ๋ฅผ ์๊ธฐํ๋ค.. ๊ทธ๋์ C[1]์ 1์ ์ ์ฅํด์ผ ํ๋ ๊ฒ์ด๋ค.
3 | 1 | 5 | 2 | 4 | 6 | |
C[1] | 3 | 1 | 1 | 1 | 1 | 1 |
C[2] | 5 | 2 | 2 | 2 | ||
C[3] | 4 | 4 | ||||
C[4] | 6 | |||||
C[5] | ||||||
C[6] |
์ด๋ฐ ์์ผ๋ก ํ์ฌ ์์์ ์๋ฆฌ๋ฅผ ์ด์งํ์์ผ๋ก ์ฐพ์ผ๋ฉด ๋๋๋ค.
์ด์งํ์์ ์ ์ ์กฐ๊ฑด์ ๋ฐฐ์ด์ด ์ ๋ ฌ๋์ด ์์ด์ผ ํ๋ค.
ํ์ฌ ์์๊ฐ ์ ์์ ๋ค์ ์ค ์ ์๋ ์ง ์๋ ์ง ํ๋จํ๊ณ ,
์ค ์ ์์ผ๋ฉด ๋ฐฐ์ด ๋ค์ ์ถ๊ฐํด์ฃผ๊ณ ์๋๋ฉด ์ด์งํ์์ ํตํด ์๋ฆฌ๋ฅผ ์ฐพ๊ณ ๊ทธ ์๋ฆฌ๋ฅผ ๊ฟฐ์ฐฌ๋ค.
์ด๋ฐ ์์ผ๋ก ๋ฐฐ์ด์ ์ ๋ ฌ์ ์ ์งํด์ค ์๊ฐ ์๋ค.
์๊ฐ๋ณต์ก๋๋ O(nlogn)
์ฝ๋
<SWEA 3307 ์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด> ๋ฌธ์ ์ ์๋ฐ ์ฝ๋๋ก ๋น๊ต๋ฅผ ํด๋ณด์.
DP-1์ ๋ฐฉ๋ฒ
int[] lis = new int[n];
int answer = 0;
for (int i=0; i<n; i++) {
lis[i] = 1;
for (int j=0; j<=i-1; j++) {
// ํ์ฌ ์์๊ฐ ๋ ํฌ๊ณ ์ ์ฅ๋ ๊ธธ์ด๋ณด๋ค (์์ ์๋ ๊ฒ + ํ์ฌ ์์)์ ๊ธธ์ด๊ฐ ๋ ๊ธธ๋ฉด
if (arr[j] < arr[i] && lis[i] < lis[j] + 1) {
lis[i] = lis[j] + 1;
}
}
}
for (int i=0; i<n; i++) {
// ์ ์ผ ํฐ ๊ฐ ์ฐพ์์ answer์ ์ ์ฅ
if (answer < lis[i]) {
answer = lis[i];
}
}
DP-2์ ๋ฐฉ๋ฒ
ArrayList<Integer> lis = new ArrayList<>();
lis.add(arr[0]); // ๋งจ ์ ์์๋ก ์ด๊ธฐํ
for (int i=1; i<n; i++) {
// lis ๋งจ ๋ค์ ์๋ ๊ฐ๋ณด๋ค ํ์ฌ ์์๊ฐ ๋ ํฌ๋ฉด ๋ค์ ์ถ๊ฐ
if (arr[i] > lis.get(lis.size()-1)) {
lis.add(arr[i]);
// ๊ทธ๋ ์ง ์์ผ๋ฉด ์ด์งํ์์ผ๋ก ์๋ฆฌ๋ฅผ ์ฐพ๊ณ ๊ต์ฒดํด์ค๋ค.
} else {
int idx = Arrays.binarySearch(lis.toArray(), arr[i]);
// binarySearch๋ฅผ ํด์ ๊ทธ ๊ฐ์ด ์์ผ๋ฉด ์ ์ ํ ์์น๋ฅผ ์์๋ก ๋ฐํํด์ฃผ๊ธฐ ๋๋ฌธ์
// ์ธ๋ฑ์ค๋ฅผ ์์๋ก ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค.
if(idx < 0) idx = -(idx+1);
lis.set(idx, arr[i]);
}
}
Arrays์ ๋ด์ฅํจ์์ธ binarySearch๋ฅผ ์ฐ๋ฉด ์ฝ๋๋ฅผ ๊ฐ๋จํ๊ฒ ์งค ์ ์๋ค.
๋ฐฐ์ด์ ์ ๋ ฌ๋์ด ์๋ค๋ ๊ฐ์ ์ ํ๊ณ ์ผ์ชฝ ์ธ์๋ก ๋ฃ์ด์ฃผ๊ณ , ์ฐพ์ผ๋ ค๋ ๊ฐ์ ์ค๋ฅธ์ชฝ ์ธ์์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
๊ฐ์ ๋ชป์ฐพ์ผ๋ฉด ์์๋ก ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ค๋ ํน์ง์ด ์๊ธฐ ๋๋ฌธ์ ์ฒ๋ฆฌ๋ฅผ ๋ ํด์ฃผ์ด์ผ ํ๋ค.
DP-1 ๋ฐฉ๋ฒ๋ณด๋ค ์๊ฐ์ ์ผ๋ก ํจ์จ์ ์ธ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ํ์ ์ธ LIS ๋ฌธ์
SW Expert Academy
SW ํ๋ก๊ทธ๋๋ฐ ์ญ๋ ๊ฐํ์ ๋์์ด ๋๋ ๋ค์ํ ํ์ต ์ปจํ ์ธ ๋ฅผ ํ์ธํ์ธ์!
swexpertacademy.com
12015๋ฒ: ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 2
์ฒซ์งธ ์ค์ ์์ด A์ ํฌ๊ธฐ N (1 ≤ N ≤ 1,000,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์๋ ์์ด A๋ฅผ ์ด๋ฃจ๊ณ ์๋ Ai๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ Ai ≤ 1,000,000)
www.acmicpc.net
'๐ฅ๏ธ Study > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ฝ๋ํธ๋ฆฌ ์กฐ๋ณ๊ณผ์ ] BFS ๋น๋ฅผ ํผํ๊ธฐ Python (0) | 2024.08.06 |
---|---|
[์ฝ๋ํธ๋ฆฌ ์กฐ๋ณ๊ณผ์ ] ์๋ฎฌ๋ ์ด์ 1์ฐจ์ ๋ฐ๋ Python (9) | 2024.07.23 |
[Algorithm/DP] ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ : ํ๋ก์ด๋-์์ (Floyd-Warshall) (0) | 2023.10.03 |
[Algorithm/DP] 0/1 Knapsack Problem (๋ฐฐ๋ญ ๋ฌธ์ ) (0) | 2023.09.25 |