[๋ฐฑ์ค][ํ๋ํฐ๋ 5][LIS] 14003. ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 5
๐ก ์ด๋ถ ํ์ O(logN)
๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด(LIS) O(n log n)
[๋ฌธ์ ]
์์ด A๊ฐ ์ฃผ์ด์ก์ ๋, ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์๋ฅผ ๋ค์ด, ์์ด A = {10, 20, 10, 30, 20, 50} ์ธ ๊ฒฝ์ฐ์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ A = {10, 20, 10, 30, 20, 50} ์ด๊ณ , ๊ธธ์ด๋ 4์ด๋ค.
[์ ๋ ฅ]
์ฒซ์งธ ์ค์ ์์ด A์ ํฌ๊ธฐ N (1 ≤ N ≤ 1,000,000)์ด ์ฃผ์ด์ง๋ค.
๋์งธ ์ค์๋ ์์ด A๋ฅผ ์ด๋ฃจ๊ณ ์๋ Ai๊ฐ ์ฃผ์ด์ง๋ค. (-1,000,000,000 ≤ Ai ≤ 1,000,000,000)
[์ถ๋ ฅ]
์ฒซ์งธ ์ค์ ์์ด A์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
๋์งธ ์ค์๋ ์ ๋ต์ด ๋ ์ ์๋ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ์ถ๋ ฅํ๋ค.
[ํ์ด]
๋น์ทํ ์ ํ์ ๋ฌธ์ ์ด์ง๋ง ์กฐ๊ฑด๋ง ๋ค๋ฅธ ๋ฌธ์ ์ธ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 4๋ DP๋ฅผ ์ฌ์ฉํด์ ํ ์ ์์ง๋ง ์ด ๋ฌธ์ ๋ N์ ๋ฒ์๊ฐ ํฌ๊ธฐ์ DP๋ฅผ ์ฌ์ฉํ๋ฉด ์๊ฐ์ด๊ณผ๋ฅผ ๋ฐ๊ฒ ๋๋ค. LIS ์๊ณ ๋ฆฌ์ฆ, ์ ์ฅ ์์น์ ๋ฐฐ์ด ์ ์ฅ ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ทผํ๋ค.
1. ์ค๋ฆ์ฐจ์์ ์ ์งํ๋ lenList ๋ฐฐ์ด
2. ์ด๋ถ ํ์ ๋ด์ฅ ํจ์๋ฅผ ์ฌ์ฉํด ์ค๋ฆ์ฐจ์์ ์ ์งํ๋ฉด์ ํ์ฌ ๊ฐ(v)์ด ๋ค์ด๊ฐ ์ ์๋ ์๋ฆฌ(insertPos)๋ฅผ ์ฐพ๋๋ค.
3. ์ต์ฅ ์ฆ๊ฐ ์์ด ๊ธธ์ด๋ฅผ ์๊ธฐ ์ํด ์ธ๋ฑ์ค ์ ์ฅ ๋ฐฐ์ด(idxList)์ insertPos๋ฅผ ํ ๋นํ๋ค.
4. ์ต์ฅ ์ฆ๊ฐ ์์ด ์ถ๋ ฅ์ ์ํด ๋ค๋ถํฐ ํ์ํ๋ฉฐ ๊ฐ์ํ๋ size์ ๋ง๋ idxList[i๋ฅผ ์ถ๋ ฅํ๋ค.
ํ์ํ ๋ฐ์ดํฐ ๋ฐ๊ฒฌ)
idxList[i] = Integer.MAX_VALUE; ๋ถ๋ถ์ ์ถ์์ฒ๋ฆฌ ํด๋ AC๋ฅผ ๋ฐ๋ ๋ฌธ์
์
๋ ฅ ๋ฒ์๋ง ๋ค๋ฅธ ๋ฌธ์ ์ธ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 2 ์๋ ์ ์ถํ๋ฉด ํ๋ ธ์ต๋๋ค๋ฅผ ๋ฐ์ง๋ง
ํด๋น ๋ฌธ์ ์๋ ์๋์ ํ
์คํธ์ผ์ด์ค๊ฐ ์๋ ๋ชจ์์ด๋ค.
Input:
4
1 3 3 2
Answer:
2
1 2
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int size = 0;
StringTokenizer st = new StringTokenizer(br.readLine());
int[] inputList = new int[N];
int[] idxList = new int[N];
int[] lenList = new int[N];
for (int i = 0; i < N; i++) {
int v = Integer.parseInt(st.nextToken());
inputList[i] = v;
int pos = Arrays.binarySearch(lenList, 0, size, v);
if(pos >= 0) {
idxList[i] = Integer.MAX_VALUE; // ์ฃผ์์ฒ๋ฆฌ ํด๋ ํต๊ณผ๊ฐ ๋๋ ๋ฌธ์ ์ ๋ฐ๊ฒฌ
continue;
}
int insertPos = Math.abs(pos) - 1;
lenList[insertPos] = v;
idxList[i] = insertPos;
if(insertPos == size) size++;
}
int len = size;
StringBuilder sb = new StringBuilder();
sb.append(size + "\n");
for (int i = N-1; i >= 0; i--) {
if(idxList[i] == size-1) {
lenList[--size] = inputList[i];
if(size == 0) break;
}
}
for (int i = 0; i < len; i++) sb.append(lenList[i] + " ");
System.out.print(sb);
}
}
[๊ฒฐ๊ณผ]
๋ฐฑ์ค(BOJ) ๋ฌธ์ ์ค [ 14003. ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 5 ] ๋ฌธ์ ๋ฅผ ํ๊ณ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.