๋ฐฑ์ค 2565๋ฒ : ์ ๊น์ค (Java)
์ด ๊ธ์ ๋ชฉ์ฐจ8๊ฐ
๐ ๋ฐฑ์ค 2565๋ฒ : ์ ๊น์ค

์๋ก ๊ต์ฐจํ์ง ์๊ฒ ์ ๊น์ค์ ์ค์นํ ์ ์๋ ์ต๋ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์
๐ ๋ฐฑ์ค 2565๋ฒ - ์ ๊น์ค
โ ์์ด๋์ด๋ฅผ ๋ ์ฌ๋ฆฌ์ง ๋ชปํจ
๋ด๊ฐ ์ ์ผ ์์ ์๋ DP๋ฌธ์ ์๊ณ , ํต์ฌ ์์ด๋์ด๋ฅผ ๋ ์ฌ๋ฆฌ์ง ๋ชปํ๋ค.
๋ฌธ์ ํ๊ทธ๋ฅผ ํ์ธํด DP๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ ๊ฒ์ ์์์์๋, DP ํ ์ด๋ธ์ ๋ง๋ค์ด์ผ ํ๋ค๋ ๊ฒ์ ๋งค๋ชฐ๋์ด ๋ค๋ฅธ ์์ด๋์ด๋ฅผ ์๊ฐํ์ง ๋ชปํ๋ค.
๐ก ํ์ํ ์์ด๋์ด
๋ฌธ์ ์์๋ **์ต์ฅ ์ฆ๊ฐ ์์ด (LIS, Longest Increasing Subsequence)**์ ์ฌ์ฉํด์ผ ํ๋ค.
์ฌํ๋ ๊ฒ์, ๋๋ LIS ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์ด๋ฏธ ์๊ณ ์๋ค๋ ๊ฒ์ด์๋ค.
LIS๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ๋ ์๊ณ ์์์ผ๋ฉฐ, ์ ๋ ฅ ๊ฐ์ด ๋ง์ ๊ฒฝ์ฐ์ ์ด์งํ์์ ์ ๋ชฉํ์ฌ ์๊ฐ๋ณต์ก๋๋ฅผ ์ค์ด๋ ๋ฐฉ๋ฒ๋ ์๊ณ ์๋ ์ํ์๋ค.
๋ฐฑ์ค - ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด ์๋ฆฌ์ฆ
๐ฅฒ ๊ทธ๋ฌ๋ ์ฝ๋ฉ ํ ์คํธ๋..
์ฝ๋ฉ ํ ์คํธ์ ์ถ์ ๋๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ง์ง ์๋ค.
BFS, DFS, ์ด์งํ์, ๋ธ๋ฃจํธ ํฌ์ค ๋ฑโฆ ์๊ณ ๋ฆฌ์ฆ ์์ฒด๋ฅผ ์ตํ๋ ๊ฒ์ ์ค๋ ๊ฑธ๋ฆฌ์ง ์๋๋ค.
๊ทธ๋ฌ๋, ์ฝ๋ฉํ ์คํธ์์ ์ฐ๋ฆฌ์ ๋ฐ๋ชฉ์ ์ก๋ ๊ฒ์ ๊ตฌํ๊ณผ DP์์ ์๊ตฌํ๋
๊ทธ๋์ ์ด ๋ฌธ์ ์ ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ ์ธ๊ฑด๋ฐ?
๋ผ๋ ๋ฌผ์์ ์ฌ๋ฐ๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ์ฑํํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
๊ณ ๋ฑํ๊ต ์ํ ๋ฌธ์ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
์๊ณ ๋ฆฌ์ฆ์ ์ตํ๋ค๋ฉด ๊ทธ ๋ค์ ๋จ๊ณ๋ ๋ง์ ๋ฌธ์ ๋ค์ ์ ํ๋ฉฐ ๋ฌธ์ ์ ๋ํ ์๊ณ ๋ฆฌ์ฆ์ ๋ ์ฌ๋ฆฌ๋ ์ฐ์ต์ด ํ์ํ ๊ฒ ๊ฐ๋ค.
โจ LIS๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ด์
LIS๋ ๋ฐฐ์ด์์ ๊ฐ์ฅ ๊ธด ์ค๋ฆ์ฐจ์ ๋ถ๋ถ ๋ฐฐ์ด์ ์ฐพ๋๋ฐ ์ฌ์ฉํ๋ค.
๊ทธ๋ฌ๋ ๋ฌธ์ ์์ LIS๋ฅผ ์ ์ฌ์ฉํด์ผํ๋์ง ๋ ์ฌ๋ฆฌ๋ ๊ฒ์ด ์ด๋ ต๋ค.

๋ฌธ์ ์์์์ A๋ฅผ ์์๋๋ก ํ์ธํ๋ฉฐ ๋งค์นญ๋๋ B๊ฐ์ ๋ณด์.
{8, 2, 9, 1, 4, 6, 7, 10} ์ธ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ค์ด ๊ฒน์น์ง ์๊ฒ ํ๋ ค๋ฉด (1, 8), (3, 9), (4, 1) ์์ ์ ๊ฑฐํด์ผ ํ๋ค.
์ดํ ๋จ๋ ๋ฐฐ์ด์ {2, 4, 6, 7}์ด ๋๋ค.
์ฆ, ์ด ๋ฌธ์ ์์ ์ค์ด ๊ฒน์น์ง ์๋๋ค -> ๊ฐ์ฅ ๊ธด ์ค๋ฆ์ฐจ์ ๋ถ๋ถ ๋ฐฐ์ด์ ์ฐพ๋๋ค.
๋ผ๋ ๊ฒฐ๋ก ์ด ๋์จ๋ค.
โ๏ธ ์ ํ์ ์ ๋ฆฌ
- ๋ฆฌ์คํธ๋ฅผ ์ ์งํ๋ฉฐ, ์๋ก์ด ๊ฐ์ด ๊ธฐ์กด ๋ฆฌ์คํธ ๋ง์ง๋ง ๊ฐ๋ณด๋ค ํฌ๋ฉด ์ถ๊ฐ
- ์๋๋ผ๋ฉด, ํด๋น ๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์ต์ด์ ์์น๋ฅผ ์ฐพ์ ํด๋น ๊ฐ์ ๋์ฒด
if (number[i] > list.get(list.size() - 1)) {
list.add(number[i]); // ์ฆ๊ฐ ์์ด ๊ณ์ ์ด์ด๊ฐ๊ธฐ
} else {
// number[i]๊ฐ ๋ค์ด๊ฐ ์์น๋ฅผ ์ฐพ์์ ๊ต์ฒด (์์ด ์ ์ง)
for (int j = 0; j < list.size(); j++) {
if (number[i] <= list.get(j)) {
list.set(j, number[i]);
break;
}
}
}
- ์ผ์ชฝ ์ ๋ด๋ ์์น ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ ํ๊ธฐ ๋๋ฌธ์, ์ค๋ฅธ์ชฝ ๊ฐ์ ๋ํด์๋ง ๋น๊ตํ๋ฉด ๋๋ค.
โ ๋ฌธ์ ์์ ์ ๋ ฅ ๊ฐ์ด ์ปค์ง๋ค๋ฉด?
ํ์ฌ ๋ฌธ์ ์์์ ์ ๋ ฅ๊ฐ ํฌ๊ธฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ฒซ์งธ ์ค์๋ ๋ ์ ๋ด๋ ์ฌ์ด์ ์ ๊น์ค์ ๊ฐ์๊ฐ ์ฃผ์ด์ง๋ค. ์ ๊น์ค์ ๊ฐ์๋ 100 ์ดํ์ ์์ฐ์์ด๋ค.
ํ์ฌ ๋ฌธ์ ์์๋ ์ ๊น์ค์ ๊ฐ์๊ฐ 100 ์ดํ๋ก ์ฃผ์ด์ง๋ฏ๋ก 2์ค for๋ฌธ์ ์ฌ์ฉํด๋ ์ฐ์ฐ ์๊ฐ 10,000๋ฒ ์ ๋์ด์ง๋ง, ๊ฐ์๊ฐ ๋์ด๋๋ค๋ฉด ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ด๋ฐ ๊ฒฝ์ฐ์๋ **์ด์ง ํ์ (Binary Search)**๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฐ๋ณต์ก๋๋ฅผ ๋ํญ ์ค์ผ ์ ์๋ค.
๐ฅ๏ธ ํ์ด ์ฝ๋ (Java)
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//StringTokenizer st = new StringTokenizer(br.readLine());
int input = Integer.parseInt(br.readLine());
int[][] inputNum = new int[input][2];
int[] number = new int[input];
for(int i=0;i<input;i++){
StringTokenizer st = new StringTokenizer(br.readLine());
inputNum[i][0] = Integer.parseInt(st.nextToken());
inputNum[i][1] = Integer.parseInt(st.nextToken());
}
Arrays.sort(inputNum, (a, b)->{
if(a[0]<b[0]) return -1;
else if(a[0]>b[0]) return 1;
else return 0;
});
for(int i=0;i<input;i++) number[i] = inputNum[i][1];
List<Integer> list = new ArrayList<>();
list.add(number[0]);
for(int i=1;i<input;i++){
if(number[i] > list.get(list.size()-1)){
list.add(number[i]);
}
else{
for(int j=0;j<list.size();j++){
if(number[i] <= list.get(j)){
list.set(j, number[i]);
break;
}
}
}
}
System.out.println(input - list.size());
}
}
โฐ ์๊ฐ๋ณต์ก๋
- ์ด์ค for๋ฌธ โ O(Nยฒ) (์ต๋ 100๊ฐ ์ ๋ ฅ์ด๋ฏ๋ก ๊ฐ๋ฅ)
- ์ด๋ถํ์ ๋ฐฉ์์ ์ฌ์ฉํ ๊ฒฝ์ฐ O(N log N)