https://www.acmicpc.net/problem/2565
2565๋ฒ: ์ ๊น์ค
์ฒซ์งธ ์ค์๋ ๋ ์ ๋ด๋ ์ฌ์ด์ ์ ๊น์ค์ ๊ฐ์๊ฐ ์ฃผ์ด์ง๋ค. ์ ๊น์ค์ ๊ฐ์๋ 100 ์ดํ์ ์์ฐ์์ด๋ค. ๋์งธ ์ค๋ถํฐ ํ ์ค์ ํ๋์ฉ ์ ๊น์ค์ด A์ ๋ด๋์ ์ฐ๊ฒฐ๋๋ ์์น์ ๋ฒํธ์ B์ ๋ด๋์ ์ฐ๊ฒฐ๋๋
www.acmicpc.net
์๊ณ ๋ฆฌ์ฆ [์ ๊ทผ ๋ฐฉ๋ฒ]
๋จผ์ ๋ฌธ์ ์์๋ ์๋ก ๊ต์ฐจ๋์ง ์๋๋ก ํ๊ธฐ ์ํด ์ฒ ๊ฑฐ๋์ด์ผ ํ ์ ์ ์ ์ต์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ๊ทธ๋ ๊ฒ ๊ตฌํ๊ธฐ์๋ ๊ต์ฐจ ์ฌ๋ถ๋ฅผ ํ์ธํด์ผ ํ๊ธฐ์ ๋ถํธํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ญ์ผ๋ก ์๊ฐํด๋ณด์. ์ฒ ๊ฑฐ๋์ด์ผ ํ ์ ์ ์ ์ต์ ๊ฐ์๋ผ ํ๋ฉด, ๊ฑฐ๊พธ๋ก ์ ์ฒด ์ ์ ์ ๊ฐ์์์ ์ต๋ํ ๊ฒน์น์ง ์๊ฒ ์ค์น ๊ฐ๋ฅํ ๊ฐ์๋ฅผ ๊ตฌํ์ฌ ๋นผ๋ฉด, ์ฆ (์ ์ฒด ์ ์ ๊ฐ์ - ์ค์น ๊ฐ๋ฅ ๊ฐ์) = ์ฒ ๊ฑฐ ๊ฐ์ ๊ฐ๋๋ค.
ํ๋ง๋๋ก ์ต๋ํ ์ค์น ๊ฐ๋ฅํ ๊ฐ์๋ฅผ ๊ตฌํ๋ฉด ๋๋ค๋ ๋ป์ด๋ค.
๋จผ์ A์ ๋ด๋ ๊ธฐ์ค์ผ๋ก i๋ฒ์งธ์ ์ฐ๊ฒฐ๋ ์ ๊น์ค์ ์๊ณ ์ดํ ์ ์ ๋ค์ ํ์ํ๋ฉด์ i๋ฒ์งธ๊ฐ ์ฐ๊ฒฐ๋ B์ ๊ฐ๋ณด๋ค ํฐ ๊ฒฝ์ฐ๋ค์ ๋ชจ๋ ํ์ํด๋ณด๋ ๊ฒ์ด๋ค. ๊ฒฐ๊ตญ ์ ๋ ฌ๋ A๋ฅผ ๊ธฐ์ค์ผ๋ก B์ ์ฐ๊ฒฐ๋ ๊ฐ๋ค์์ LIS๋ฅผ ํ๋ฉด ๋๋ค๋ ๊ฒ์ด๋ค. ์ด์ ์ ๋ฐฐ์ ๋ LIS๋ฅผ ํ์ด๋ดค๋ค๋ฉด ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋ ๋ฌธ์ ๋ผ๋ ๊ฒ์ด๋ค.
๋จผ์ A์ B์ ๋ด๋๋ฅผ ์๋ฏธํ๋ 2์ฐจ์ ๋ฐฐ์ด๊ณผ ๋ฉ๋ชจ์ด์ ์ด์ ํ ๋ฐฐ์ด ๋ ๊ฐ์ง๊ฐ ํ์ํ๊ฒ ๋ค. wire๋ฐฐ์ด์ ์ ์ธํ ๊ฑด๋ฐ, wire[N][0] ์ด A์ ๋ด๋, wire[N][1] ์ด B์ ๋ด๋๋ค. ๋ํ dp์ ๊ฒฝ์ฐ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ํธํ๊ฒ ํ๋จํ๊ธฐ ์ํด Integer ๊ฐ์ฒด ๋ฐฐ์ด๋ก ์ ์ธํ๋ค.
int[][] wire = new int[N][2];
Integer[] dp = new Integer[N];
๊ทธ๋ฆฌ๊ณ wire์ ์ ๋ ฅ์ ๋ฐ์๋ค๋ ๊ฐ์ ํ์, wire๋ฐฐ์ด์ A์ ๋ด๋ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํด์ผํ๋๋ค. Arrays.sort() ๋ฉ์๋ ์์ฒด์๋ 2์ฐจ์ ๋ฐฐ์ด์ ์ ๋ ฌํด์ฃผ๋ ๊ฒ์ด ์์ผ๋ฏ๋ก comparator๋ฅผ ์ด์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ ฌํ๋ค.
int[][] wire = new int[N][2];
Integer[] dp = new Integer[N];
Arrays.sort(wire, Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
์ฌ๊ท๋ก ํ๋ ค๋ฉด ๋จผ์ A์ ๋ด๋์ ํ์ ๊ธฐ์ค๊ฐ์ ์ค์ฌ์ผ๋ก B์ ์ฐ๊ฒฐํ ๋ ์ด์ ์ B์ ์ฐ๊ฒฐ๋ ์ ๋ด๋ ๊ฐ๋ณด๋ค ์ปค์ผํ๋ค. ๊ทธ๋์ผ ๊ฒน์น์ง ์๊ฒ ํ ์ ์์ง ์๊ฒ ๋๊ฐ. ์ฆ, N+1๋ถํฐ ๋ง์ง๋ง ๊น์ง A์ ๋ด๋๋ฅผ ๊ธฐ์ค์ผ๋ก ํ์ํ๋ฉด์ B์ ๋ด๋์ ์ฐ๊ฒฐ ๊ฐ๋ฅ ํ์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ , ์ฐ๊ฒฐ ๊ฐ๋ฅํ๋ค๋ฉด ๊ทธ ๋ค์์ ์ฐ๊ฒฐํ ์ ์ ์ ํ์ํ๊ธฐ ์ํด ์ฌ๊ท๋ฅผ ํด์ฃผ๋ ๊ฒ์ด๋ค.
์ฆ, ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑํ ์ ์๋ค.
static int recur(int N) {
// ํ์ํ์ง ์์๋ ์์น๋ผ๋ฉด
if(dp[N] == null) {
dp[N] = 1; // ์ต์๊ฐ 1๋ก ์ด๊ธฐํ
// A์ N๋ฒ์งธ์ ์ดํ์ ์ ๋ด๋๋ค ๋น๊ต
for(int i = N + 1; i < dp.length; i++) {
/*
* A์ ๋ด๋์ N๋ฒ์งธ ์ ์ ์ด ์ฐ๊ฒฐ๋์ด์๋ B์ ๋ด๋๋ณด๋ค A์ i๋ฒ์งธ
* ์ ๋ด๋์ ์ ์ ์ด ์ด์ด์ง B์ ๋ด๋๊ฐ ๋ค์ ์์ ๊ฒฝ์ฐ
* ์ ์ ์ ์ค์นํ ์ ์์
*/
if(wire[N][1] < wire[i][1]) {
// ์ฐ๊ฒฐ ๊ฐ๋ฅํ ์ ์ ์ ๊ฒฝ์ฐ์ ์ ์ค ํฐ ๊ฐ์ dp์ ์ ์ฅํ๋ค.
dp[N] = Math.max(dp[N], recur(i) + 1);
}
}
}
return dp[N];
}
ottom-Up ๋ฐฉ์์ธ for๋ฌธ์ ๋ฐ๋๋ก A์ ๋ด๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด์ ์ A์ ๋ด๋๋ค์ ์ดํด๋ณด๋ฉด์ ๋ฉ๋ชจ์ด์ ์ด์ ์ ํ๋ฉด ๋๋ค.
for(int i = 0; i < dp.length; i++) {
dp[i] = 1; // ์ต์ ๊ฐ์์ธ 1๋ก ์ด๊ธฐํ
/*
* i๋ฒ์งธ ์ ๋ด๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด์ ์ ์ ๋ด๋๋ค์
* ์ ์ ์ ์ฐ๊ฒฐํ๊ธฐ ์ํ ํ์
* ์ฆ, i๋ฒ์งธ ์ ๋ด๋์ ์ฐ๊ฒฐ๋ B์ ๋ด๋๋
* ํ์ํ j๋ฒ์งธ ์ ๋ด๋์ ์ฐ๊ฒฐ๋ B์ ๋ด๋๋ณด๋ค ๊ฐ์ด ์ปค์ผํจ
*/
for(int j = 0; j < i; j++) {
if(wire[i][1] > wire[j][1]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
}
์ฃผ์์ผ๋ก๋ ์ค๋ช ์ ํ์ง๋ง, ์ ์ฒ๋ผ i๋ฒ์งธ A์ ๋ด๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ทธ ์ด์ ์ ์ ๋ด๋๋ค์ ํ์ํ๋ฉด์ ์ด์ ์ A์ ๋ด๋ ์ค B์ ์ฐ๊ฒฐ ๊ฐ๋ฅํ๋ ค๋ฉด i๋ฒ์งธ์ B์ ๋ด๋๋ณด๋ค ๊ฐ์ด ์์์ผ ํ๋ค.
๋ง์ฝ ์๋ค๋ฉด ๋ฉ๋ชจ์ด์ ์ด์ ๋ ๊ฐ + 1๊ณผ ํ์ฌ i๋ฒ์งธ ๋ฉ๋ชจ์ด์ ์ด์ ์ค ํฐ ๊ฐ์ผ๋ก ๊ฐฑ์ ํ๋ ๊ฒ์ด๋ค.
์์ 11053๋ฒ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด ๋ฌธ์ ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋๋ก ์์ฉํ ๋ฐฉ๋ฒ์ด ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ถ๋ ฅ ๊ฐ์ ์ฒ์ ๋งํ๋ฏ ์ ์ฒด ์ ์ ๊ฐ์ - ์ค์น ๊ฐ๋ฅํ ์ต๋ ๊ฐ์๋ฅผ ๋นผ์ฃผ๋ฉด ๋๋ค.
ํ์ด ๋ฐ ์ฝ๋
- ๋ฐฉ๋ฒ 1 : [Scanner + Top-Down]
import java.util.Scanner;
import java.util.Arrays;
import java.util.Comparator;
public class Main {
static Integer[] dp;
static int[][] wire;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
dp = new Integer[N];
wire = new int[N][2];
for(int i = 0; i < N; i++) {
wire[i][0] = in.nextInt();
wire[i][1] = in.nextInt();
}
// ์ฒซ ๋ฒ์งธ ์์(A์ ๋ด๋)๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์์ผ๋ก ์
Arrays.sort(wire, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
int max = 0;
/*
* i๋ฒ์งธ A์ ๋ด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฐ๊ฒฐ๊ฐ๋ฅํ ๊ฐ์ ํ์
* ๋ฐ ์ต๋๊ฐ ์ฐพ๊ธฐ
*/
for(int i = 0; i < N; i++) {
max = Math.max(recur(i), max);
}
// ์ ์ ๊ฐ์ - ์ต๋๊ฐ
System.out.println(N - max);
}
static int recur(int N) {
// ํ์ํ์ง ์์๋ ์์น๋ผ๋ฉด
if(dp[N] == null) {
dp[N] = 1; // ์ต์๊ฐ 1๋ก ์ด๊ธฐํ
// A์ N๋ฒ์งธ์ ์ดํ์ ์ ๋ด๋๋ค ๋น๊ต
for(int i = N + 1; i < dp.length; i++) {
/*
* A์ ๋ด๋์ N๋ฒ์งธ ์ ์ ์ด ์ฐ๊ฒฐ๋์ด์๋ B์ ๋ด๋๋ณด๋ค A์ i๋ฒ์งธ
* ์ ๋ด๋์ ์ ์ ์ด ์ด์ด์ง B์ ๋ด๋๊ฐ ๋ค์ ์์ ๊ฒฝ์ฐ
* ์ ์ ์ ์ค์นํ ์ ์์
*/
if(wire[N][1] < wire[i][1]) {
// ์ฐ๊ฒฐ ๊ฐ๋ฅํ ์ ์ ์ ๊ฒฝ์ฐ์ ์ ์ค ํฐ ๊ฐ์ dp์ ์ ์ฅํ๋ค.
dp[N] = Math.max(dp[N], recur(i) + 1);
}
}
}
return dp[N];
}
}
- ๋ฐฉ๋ฒ 2 : [Scanner + Bottom-Up]
import java.util.Scanner;
import java.util.Arrays;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int[] dp = new int[N];
int[][] wire = new int[N][2];
for(int i = 0; i < N; i++) {
wire[i][0] = in.nextInt();
wire[i][1] = in.nextInt();
}
// A์ ๋ด๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
Arrays.sort(wire, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
for(int i = 0; i < dp.length; i++) {
dp[i] = 1; // ์ต์ ๊ฐ์์ธ 1๋ก ์ด๊ธฐํ
/*
* i๋ฒ์งธ ์ ๋ด๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด์ ์ ์ ๋ด๋๋ค์
* ์ ์ ์ ์ฐ๊ฒฐํ๊ธฐ ์ํ ํ์
* ์ฆ, i๋ฒ์งธ ์ ๋ด๋์ ์ฐ๊ฒฐ๋ B์ ๋ด๋๋
* ํ์ํ j๋ฒ์งธ ์ ๋ด๋์ ์ฐ๊ฒฐ๋ B์ ๋ด๋๋ณด๋ค ๊ฐ์ด ์ปค์ผํจ
*/
for(int j = 0; j < i; j++) {
if(wire[i][1] > wire[j][1]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
}
int max = 0;
for(int i = 0; i < N; i++) {
max = Math.max(max, dp[i]);
}
// ์ ์ฒด ๊ฐ์ - ์ค์น ๊ฐ๋ฅํ ์ ๊น์ค = ์ต์ ์ฒ ๊ฑฐ ๊ฐ์
System.out.println(N - max);
}
}