BOJ_S2_11053
๐ [S2_11053] ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main{
static StringTokenizer st;
static int[] arr, dp;
static int N;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// ์์ด์ ํฌ๊ธฐ
N = Integer.parseInt(br.readLine());
// ์์ด ๊ฐ ์ ์ฅ
arr = new int[N];
// ๋น๊ตํ ๊ฐ ์ ์ฅ
dp = new int[N];
// ์ฒ์ ๊ฐ์ 0 ์ด๋ค
int LIS = 0;
// ๋ฐฐ์ด ์
๋ ฅ
st = new StringTokenizer(br.readLine(), " ");
for(int i=0; i<N; i++){
arr[i] = Integer.parseInt(st.nextToken());
}
for(int i=0; i<N; i++){
// dp ๋ฐฐ์ด์ ์ ์ฅ๋ ์์น
int idx = BinarySearch(arr[i], 0, LIS, LIS+1);
// ๋ชป์ฐพ์๊ฒฝ์ฐ
if(idx == -1){
dp[LIS] = arr[i];
LIS++;
}
// ์ฐพ์ ๊ฒฝ์ฐ
else{
dp[idx] = arr[i];
}
}
System.out.println(LIS);
}
// ์ด๋ถ ํ์์ ํตํด์ ์์น ์ฐพ๊ธฐ
public static int BinarySearch(int num, int start, int end, int size) {
int res = 0;
while(start<=end){
// ์ค์ ๊ฐ์ ์ฐพ๋๋ค
int mid = (start+end)/2;
// ํ์ฌ ์ ํ๋ ์์๊ฐ ํด๋น ์์๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค๋ฉด ์๋ถ๋ถ ํ์
if(num <= dp[mid]){
res = mid;
end = mid-1;
}
// ํ์ฌ ์ ํ๋ ์์๊ฐ ํด๋น ์์๋ณด๋ค ํฌ๋ค๋ฉด ๋ท ๋ถ๋ถ ํ์
else {
start = mid + 1;
}
}
// dp ํ
์ด๋ธ์์ ์ฝ์
๋ ์์น๋ฅผ ๋ชป์ฐพ์ ๊ฒฝ์ฐ ( ๋ชจ๋ ์๋ค๋ณด๋ค ํฐ ๊ฒฝ์ฐ )
if(start==size){
return -1;
}
// dp ํ
์ด๋ธ์์ ์ฝ์
๋ ์์น๋ฅผ ์ฐพ์ ๊ฒฝ์ฐ
else{
return res;
}
}
}
๐ค ๋์ ์๊ฐ
LIS ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์ด๋ค.
์ด ๋ฌธ์ ๋ฅผ ํ๋ฉด์ LIS๋ฅผ ๊ณต๋ถํ์๋๋ฐ.. ์ข ์ด๋ ต๋ค.
๊ตฌ์กฐ๋ ํ์
ํ์๋๋ฐ ๋ด๊ฐ ์ด๋ถ ํ์์ ์์ง ์ ๋ชปํด์ ๊ทธ๋ฐ๊ฐ ์ถ๊ธฐ๋ ํ๊ณ
๊ทธ๋๋ ์ด๋ค ๊ตฌ์กด์ง๋ ํ์
ํด์ ๋ง์กฑ์ค๋ฌ์ ๋ค. ์ข ๋ LIS ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๋ฉด์ ๊บ ๋ฌ์์ผ๊ฒ ๋ค.
๊ทธ๋ฆฌ๊ณ ์๊ฐ ๋ณต์ก๋๊ฐ dp๋ก ํ๋ฉด N์ด ์ปค์ง๋ฉด ๋ถ๊ฐ๋ฅ ํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฅ ์ฒ์๋ถํฐ ๋ฐ๋ก ์ด๋ถ ํ์์ผ๋ก ๊ณต๋ถ๋ฅผ ํ์๋ค.
๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ํ๋ฉด ํ์ ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ด๋ถ ํ์์ผ๋ก ์ ๊ทผํ๋ ๊ฒ์ ์ถ์ฒํ๋ค.