๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/12014
โธ ๋ฌธ์
์ด๋ ๋ ๋น์ ์ ์ถ๊ทผ๊ธธ์, ์งํ์ฒ ์ญ ์ฐ๋ ๊ธฐํต์์ ๋๋ผ์ด ๋ฌธ์๋ฅผ ์ป๊ฒ ๋์๋ค. ์ด ๋ฌธ์๋ ๋ฏธ๋์ ์ด๋ค ํ์ฌ์ ์ฃผ์ ๊ฐ๊ฒฉ์ ๋ณ๋์ด ๋ด๊ฒจ ์์๋ค. ์ค๋ง ํ๋ ๋ง์์ผ๋ก ์ด ํ์ฌ์ ์ฃผ์ ๊ฐ๊ฒฉ์ ๋ณ๋์ ๋ณธ ๊ฒฐ๊ณผ, ๋ฌธ์์ ๋ด๊ธด ๋ด์ฉ์ด ์ฌ์ค์ด๋ผ๋ ๊ฒ์ ์๊ฒ ๋์๋ค. ์๋ง๋ ๋ฏธ๋์์ ํ์๋จธ์ ์ ํ๊ณ ์จ ํ์์ด ์ ์กฐ๋ฅผ ๋๊ธฐ ์ํด์ ๋ณด๋ธ ๊ฒ์ด ์๋๊น ํ๋ ๋ง์์ด ๋ค์๋ค.
์์ผ๋ก N ์ผ๊ฐ ์ฃผ์ ๊ฐ๊ฒฉ์ด N ๊ฐ์ ์ซ์๋ก ์ฃผ์ด์ ธ ์๋ค. ๋น์ ์ ์ง๊ธ๊น์ง ์ฃผ์์ด๋ผ๋ ๊ฒ์ ๊ฑฐ๋ํด๋ณธ ์ ์ด ์๊ธฐ ๋๋ฌธ์, ์ฆ๊ถํ์ฌ์ ๊ฐ์ ๊ฑฐ๋๋ฅผ ์์ํ๊ธฐ๋ก ํ๋ค. ๋ฏธ๋๋ฅผ ์๋ฉด์ ์ฃผ์์ ๊ฑฐ๋ํ๋ค๋ฉด ๋ค๋ฅธ ์ฌ๋๋ค์ด ์์ฌํ ์ง๋ ๋ชจ๋ฅธ๋ค๋ ์๊ฐ์ด ๋ค์ด์, ์ด K ๋ฒ ์ฃผ์์ ์ฌ๊ธฐ๋ก ํ๋ค. ํ๋ฃจ์๋ ์ฃผ์์ ํ ๋ฒ๋ง ์ด์ ์๊ธฐ ๋๋ฌธ์, ์ฃผ์์ ์ฌ๋ ๋ ์ ์ด K ์ผ์ด๋ค.
์์ฌ์ ๋ ์ค์ด๊ธฐ ์ํด์, ์ฃผ์์ ์ด ๋๋ง๋ค ๋งจ ์ฒ์์ ์ ์ธํ๊ณ ๋ ๋ฐ๋ก ์ง์ ์ ์ฃผ์์ ์์ ๋๋ณด๋ค ๊ฐ๊ฒฉ์ด ์ฌ๋ผ๊ฐ์ ๋๋ง ์ฌ๊ธฐ๋ก ํ๋ค. ์๋ฅผ ๋ค์ด, 10์ผ๊ฐ ์ฃผ๊ฐ์ ๋ณ๋์ด ๋ค์ ํ์ ๊ฐ๋ค๊ณ ํ์.
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
100 | 50 | 70 | 90 | 75 | 87 | 105 | 78 | 110 | 60 |
K=3์ด๋ผ๋ฉด, 2์ผ, 3์ผ, 4์ผ์ ์ฃผ์์ ์ฌ๋ฉด ๊ทธ๋ ์ ์ฃผ๊ฐ๋ 50, 70, 90์ด๊ธฐ ๋๋ฌธ์ ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ค. ๋ง์ฝ K=6์ด๋ผ๋ฉด, 2์ผ, 3์ผ, 5์ผ, 6์ผ, 7์ผ, 9์ผ์ ์ฃผ์์ ์ฌ๋ฉด ์ฃผ๊ฐ๊ฐ 50, 70, 75, 87, 105, 110์ด๊ธฐ ๋๋ฌธ์ ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ค. K=10์ด๋ผ๋ฉด ์กฐ๊ฑด์ ๋ง์กฑํ ์ ์๋ค.
N๊ณผ K, ์ฃผ๊ฐ๊ฐ ์ฃผ์ด์ก์๋ ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ง์กฑํ๊ฒ ์ฃผ์์ ๊ตฌ์ ํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ์๋ ค์ฃผ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
โธ ์ ๋ ฅ
์ ๋ ฅ ํ์ผ์๋ ์ฌ๋ฌ ํ ์คํธ ์ผ์ด์ค๊ฐ ํฌํจ๋ ์ ์๋ค. ํ์ผ์ ์ฒซ์งธ ์ค์ ์ผ์ด์ค์ ๊ฐ์ T(2 ≤ T ≤ 100)๊ฐ ์ฃผ์ด์ง๊ณ , ์ดํ ์ฐจ๋ก๋ก T ๊ฐ ํ ์คํธ ์ผ์ด์ค๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค์ ์ฒซ ์ค์ ๋ ์ ์ N๊ณผ K์ด ์ฃผ์ด์ง๋ค. N์ ์์ผ๋ก ์ฃผ๊ฐ๋ฅผ ์ ์ ์๋ ๋ ์์ด๋ฉฐ, (1 ≤ N ≤ 10,000) K๋ ๊ฑฐ๋์ ํ์์ด๋ค. (1 ≤ K ≤ 10,000) ๋ค์ ์ค์๋ ์์ผ๋ก N ๋ ์ ์ฃผ๊ฐ๊ฐ ์ฌ์ด์ ๊ณต๋ฐฑ์ ๋๊ณ ์ฃผ์ด์ง๋ค. ์ฃผ๊ฐ๋ 1๋ถํฐ 10,000 ์ฌ์ด์ ์ ์์ด๋ค.
โธ ์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค์ ๋ํด์ ์ถ๋ ฅ์ ํ ์ค๋ก ๊ตฌ์ฑ๋๋ค. T ๋ฒ์งธ ํ ์คํธ ์ผ์ด์ค์ ๋ํด์๋ ์ฒซ์งธ ์ค์๋ "Case #T"๋ฅผ ์ถ๋ ฅํ๋ค. ๋ ๋ฒ์งธ ์ค์๋ ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ง์กฑํ๊ฒ ์ฃผ์์ ์ด ์ ์์ผ๋ฉด 1, ์๋๋ฉด 0์ ์ถ๋ ฅํ๋ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ๊ณจ๋ 2
- ๐ ๋ฌธ์ ์ ํ : ์ด๋ถ ํ์, ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด: o(n log n)
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
์ด ๋ฌธ์ ๋ N์ผ ๊ฐ์ ์ฃผ์ ๊ฐ๊ฒฉ์ด ์ฃผ์ด์ก์ ๋, K๋ฒ ์ฃผ์์ ๊ตฌ๋งคํ ์ ์๋์ง ํ๋จํ๋ ๋ฌธ์ ์ด๋ค. ๋จ, ์ฒซ๋ ์ ์ ์ธํ๊ณ ๋ ์ด์ ์ ๊ตฌ๋งคํ ๋ ๋ณด๋ค ๊ฐ๊ฒฉ์ด ์ค๋ฅธ ๋ ์๋ง ์ถ๊ฐ๋ก ๊ตฌ๋งคํ ์ ์๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด(LIS)์ ๊ธธ์ด๋ฅผ ๊ตฌํ ๋ค, ๊ทธ ๊ฐ์ด k ์ด์์ธ์ง ๋น๊ตํ๋ฉด ๋๋ค. ์ด๋, LIS์ ๊ธธ์ด๋ ์ด๋ถ ํ์์ ํ์ฉํ๋ฉด O(N log N)์ ์๊ฐ ๋ณต์ก๋๋ก ๊ตฌํ ์ ์๋ค.
๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด(LIS)๋?
LIS(Longest Increasing Subsequence)๋, ์ฃผ์ด์ง ์์ด์์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ๊ฐ์ฅ ๊ธด ๋ถ๋ถ ์์ด์ ์๋ฏธํ๋ค. ์ด๋, ๋ถ๋ถ ์์ด์ ๋ฐ๋์ ์ฐ์์ ์ผ ํ์ ์์ผ๋ฉฐ, ์ ์ผํ์ง ์์ ์ ์๋ค.
arr | 2 | 1 | 3 | 5 | 4 |
์์ ๊ฐ์ ์์ด์ด ์๋ค๊ณ ๊ฐ์ ํ์.
memo | 2 |
๋จผ์ , LIS๋ฅผ ์ ์ฅํ memo ๋ฐฐ์ด์ ๋ง๋ค์ด์, arr[0]์ ๊ฐ์ memo ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ๊ฐ์ผ๋ก ๋ฃ๋๋ค.
memo | 1 |
arr[1] = 1์ผ๋, ํ์ฌ memo์ ๋ง์ง๋ง ๊ฐ์ธ 2๋ณด๋ค 1์ด ์๋ค.
์ด ๊ฒฝ์ฐ, ์ด๋ถ ํ์์ ์ฌ์ฉํด ๋ค์ด๊ฐ ์์น์ธ 0๋ฒ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๊ณ , ํด๋น ์์น์ ๊ฐ์ ๊ต์ฒดํ๋ค.
memo | 1 | 3 |
arr[2] = 3 ์ผ๋, ํ์ฌ memo ๋ฐฐ์ด์ ๋ง์ง๋ง ๊ฐ์ธ 1๋ณด๋ค 3์ด ํฌ๋ค.
์ด ๊ฒฝ์ฐ, ๋ฐ๋ก ๋งจ ๋ค์ ๊ฐ์ ์ถ๊ฐํ๋ค.
memo | 1 | 3 | 5 |
arr[3] = 5์ผ๋, ํ์ฌ memo ๋ฐฐ์ด์ ๋ง์ง๋ง ๊ฐ์ธ 3๋ณด๋ค 5๊ฐ ํฌ๋ค.
์ด ๊ฒฝ์ฐ, ๋ฐ๋ก ๋งจ ๋ค์ ๊ฐ์ ์ถ๊ฐํ๋ค.
memo | 1 | 3 | 4 |
arr[4] = 4์ผ๋, ํ์ฌ memo ๋ฐฐ์ด์ ๋ง์ง๋ง ๊ฐ์ธ 5๋ณด๋ค 4๊ฐ ์๋ค.
์ด ๊ฒฝ์ฐ, ์ด๋ถ ํ์์ ์ฌ์ฉํด ๋ค์ด๊ฐ ์์น์ธ 2๋ฒ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๊ณ , ํด๋น ์์น์ ๊ฐ์ ๊ต์ฒดํ๋ค.
์ต์ข ์ ์ผ๋ก memo = {1, 3, 4}์ด๋ฏ๋ก, LIS์ ๊ธธ์ด๋ 3์ด๋ค.
์ฆ, LIS๋ฅผ ์ ์งํ๋ฉด์ ์๋ก์ด ์์๊ฐ ๋ค์ด๊ฐ ์์น๋ฅผ ์ด๋ถ ํ์์ผ๋ก ์ฐพ์ ์ฝ์ ํ๊ฑฐ๋ ๊ต์ฒดํ๋ ๋ฐฉ์์ผ๋ก LIS๋ฅผ ๊ตฌํํ๋ค.
์ ํ์ด๋ฅผ ์ฝ๋๋ก ์์ฑํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
โ ์ต์ข ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 42096KB
์๊ฐ : 292ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int n, k;
static int[] stock;
static int[] memo; // LIS๋ฅผ ์ ์ฅํ ๋ฐฐ์ด
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
StringTokenizer st;
int tIdx = 1;
while (t --> 0) {
sb.append("Case #").append(tIdx++).append("\n");
st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken()); // ์์ผ๋ก ์ฃผ๊ฐ๋ฅผ ์ ์ ์๋ ๋ ์
k = Integer.parseInt(st.nextToken()); // ๊ฑฐ๋์ ํ์
stock = new int[n];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
stock[i] = Integer.parseInt(st.nextToken());
}
memo = new int[n+1];
int len = 0; // LIS ๊ธธ์ด
int idx; // ์ธ๋ฑ์ค
for (int i = 0; i < n; i++) {
// ์ฃผ์ ๊ฐ๊ฒฉ์ด ํ์ฌ LIS์ ๋ง์ง๋ง ๊ฐ๋ณด๋ค ํฌ๋ฉด, LIS ๊ธธ์ด๋ฅผ ์ฆ๊ฐ์ํค๋ฉฐ ๊ฐ๊ฒฉ์ ์ถ๊ฐ
if (stock[i] > memo[len]) {
len += 1;
memo[len] = stock[i];
} else {
// ๊ทธ๋ ์ง ์์ผ๋ฉด, ์ด๋ถ ํ์์ ํตํด ๋ค์ด๊ฐ ์์น๋ฅผ ์ฐพ์ ํด๋น ์์น์ ๊ฐ์ ๊ต์ฑ
idx = binarySearch(0, len, stock[i]);
memo[idx] = stock[i];
}
}
// LIS์ ๊ธธ์ด๊ฐ k ์ด์์ด๋ฉด 1์ ์ถ๋ ฅ, ์๋๋ฉด 0์ ์ถ๋ ฅ
if (len >= k) sb.append(1).append("\n");
else sb.append(0).append("\n");
}
System.out.println(sb.toString());
}
// memo ๋ฐฐ์ด์์ target์ด ๋ค์ด๊ฐ ์์น๋ฅผ ์ฐพ์
private static int binarySearch(int start, int end, int target) {
int mid;
while (start < end) {
mid = start+(end-start)/2;
if (memo[mid] < target) {
start = mid+1;
} else end = mid;
}
return end;
}
}
์ต๊ทผ์ ์ด๋ถ ํ์์ผ๋ก ๋ค์ ํ์๋ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด ๋ฌธ์ ์ ๊ฐ์ ๋ฌธ์ ์๋ค.
์ฒ์์๋ ์ด๋ถ ํ์์ ํ์ฉํด์ LIS๋ฅผ ๊ตฌํ๋ ํ์ด๊ฐ ์ ์ดํด ์ ๊ฐ๋๋ฐ, ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ํ์ด๋ฅผ ์ ๋ฆฌํ๋ ๊ณผ์ ์์ ํ์คํ ์ดํดํ ์ ์์ด ์ข์๋ค. ํด๊ฒฐ ์๋ฃ ! ๐
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Boj_2550] ์ ๊ตฌ (0) | 2025.02.20 |
---|---|
[Boj_2696] ์ค์๊ฐ ๊ตฌํ๊ธฐ (0) | 2025.02.15 |
[Boj_22254] ๊ณต์ ์ปจ์คํดํธ ํธ์ (1) | 2025.02.07 |
[Boj_5214] ํ์น (0) | 2025.01.31 |
[Boj_16509] ์ฅ๊ตฐ (0) | 2025.01.30 |