๋ฌธ์ : boj.kr/2565
๋ ์ง: 09/11 (์)
์ฑ๊ณต์ฌ๋ถ: X [00:52:17]

์ ๊น์ค์ด ๊ต์ฐจํ์ง ์๋๋ก ์ต์์ ์ ๊น์ค์ ์ ๊ฑฐํ๊ณ ๊ทธ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ ๋ฌธ์ ์ด๋ค. ๊ฐ์ฅ ๋จผ์ ์๊ฐํด๋ณผ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ ์์ ํ์์ด๋ค. ๋ชจ๋ ์ ๊น์ค์ 1๊ฐ, 2๊ฐ, 3๊ฐ, ..., n๊ฐ๊น์ง ์ ๊ฑฐํ๋ฉด์ ์ต์์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๊ฒ์ด๋ค. ์ ๊น์ค์ ๊ฐ์๊ฐ ์ต๋ 100๊ฐ์ด๋๊น ์ด ๋ฐฉ๋ฒ์ ์ ๊น์ค์ ๊ณ ๋ฅด๋๋ฐ์๋ง 100C1 + 100C2 + 100C3 + ... + 100C100๋งํผ์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค. ๊ฐ์ฅ ํฐ ๊ฒฝ์ฐ์ ์์ธ 100C50๊ฐ ์ฝ 1 * 10^29์ด๋ฏ๋ก ์ด ๋ฐฉ๋ฒ์ ์๋๋ค.
๊ทธ๋ผ ๊ต์ฐจํ๋ ์๊ฐ ๋ง์ ์ ๊น์ค ์์ฃผ๋ก ์์ ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ ์ ์๋ค. ์์ ์์ ๋ฅผ ๊ฐ์ฅ ๋ง์ ์ ๊น์ค์ ๊ต์ฐจํ๋ ์์ผ๋ก ์ ๋ ฌํ๋ฉด,
1 8
3 9
4 1
...
์ด๋ฌ๋ฉด 0๊ฐ์ธ ์ ๊น์ค์ด m์ด๋ผ๊ณ ํ์ ๋, ๊ต์ฐจํ๋ ์ ๊น์ค์ ์ ํํ๋ ๊ฒ๋งํด๋ n-mC1 + n-mC2 + ... + n-mCn-m ์ผ๋ก ๋ณผ ์ ์๋ค. ์ด๊ฒ๋ ๊ฒฐ๊ตญ ์์ ์ํ๊ณผ ๋ค๋ฅผ๋ฐ ์์ด์ง๋ค. ์์ ์๊ฐ์ ๋ค์ง์ด ์ ๊น์ค์ ๊ต์ฐจํ์ง ์๊ณ ์ต๋๋ก ์ฐ๊ฒฐํ๋ ์ ๊น์ค ๊ฐ์๋ฅผ ์ฐพ์ ์ ์ฒด ์ ๊น์ค ๊ฐ์์์ ๋นผ๋ฉด ๋ต์ด์ง ์์๊น?
๊ทธ๋ฆผ์ ๊ธฐ์ค์ผ๋ก ๊ต์ฐจํ์ง ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ ๊ฐ๊ฐ ์๋์ ๊ฐ๋ค.
(1, 8), (3, 9), (10, 10)
(2, 2), (6, 4), (7, 6), (9, 7), (10, 10)
(4, 1), (6, 4), (7, 6), (9, 7), (10, 10)
์ด ๊ฒฝ์ฐ์ ์๋ค์ ๋ชจ๋ ์ดํด๋ณด๋ฉด ์ ๋ ฌ๋ A๋ฅผ ๊ธฐ์ค์ผ๋ก B๊ฐ ์ค๋ฆ์ฐจ์์ ์ ์งํ๊ณ ์๋ค. ์ฆ, ๊ฐ๊ฐ์ ๊ฒฝ์ฐ์ ์๊ฐ ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์์ ์ ์ ์๋ค. ๊ทผ๋ฐ ์ฐ๋ฆฌ๊ฐ ์ฐพ๊ณ ์ ํ๋๊ฑด ๊ต์ฐจํ์ง ์๊ณ ์ต๋๋ก ์ฐ๊ฒฐํ๋ ๊ฒฝ์ฐ์ ์์ด๋ฏ๋ก ๊ฒฐ๊ตญ ์ด ๋ฌธ์ ๋ ์ ๋ ฌ๋ A๋ฅผ ๊ธฐ์ค์ผ๋ก B๊ฐ LIS์ธ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ฉด ๋๋ ๊ฒ์ด๋ค!
์ฝ๋
import java.io.*;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
int[][] cable = new int[n][2];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
cable[i][0] = Integer.parseInt(st.nextToken());
cable[i][1] = Integer.parseInt(st.nextToken());
}
Arrays.sort(cable, (Comparator.comparingInt(o -> o[0])));
int[] lis = new int[n];
lis[0] = cable[0][1];
int idx = 0;
for (int i = 1; i < n; i++) {
if (cable[i][1] > lis[idx]) lis[++idx] = cable[i][1];
else {
int low = -1;
int high = idx;
while (low + 1 < high) {
int mid = (low + high) / 2;
if (lis[mid] >= cable[i][1]) high = mid;
else low = mid;
}
lis[high] = cable[i][1];
}
}
int ret = 0;
for (int i = 0; i < n; i++) if (lis[i] != 0) ret++;
System.out.println(n - ret);
}
}
'์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
2240 - ์๋๋๋ฌด (0) | 2024.09.20 |
---|---|
2098 - ์ธํ์ ์ํ (2) | 2024.09.17 |
1561 - ๋์ด ๊ณต์ (2) | 2024.09.09 |
2156 - ํฌ๋์ฃผ ์์ (0) | 2024.08.30 |
1463 - 1๋ก ๋ง๋ค๊ธฐ (0) | 2024.08.29 |