1. ๋ฌธ์ ์ค๋ช ๐
์ผ๋ฐ์ ์ธ ๋งค๊ฐ๋ณ์ ํ์
์ด๋ ์ด๋ถ ํ์
๋ฌธ์ ๋ณด๋ค ๊น๋ค๋ก์ ๋ ์ ์,
- 1๏ธโฃ ํต๋๋ฌด์ ์๋ฅผ ์ ์๋ ์์น๊ฐ ์ ํด์ ธ ์๋ค.
- 2๏ธโฃ ํต๋๋ฌด์ ๊ฐ์ฅ ๊ธด ์กฐ๊ฐ์ ์๊ฒ ๋ง๋ค์์ ๋, ์ ์ผ ์ฒ์ ์๋ฅธ ์์น๋ ๊ฐ์ด ์ถ๋ ฅ ํด๋ผ.
์๋ค. ์ด๊ฑธ ์ ๋ ํ๋ฉฐ ๋ฌธ์ ๋ฅผ ํ์ด์ผ ํ๋ค.
2. ๊ตฌํ ๋ฐฉ๋ฒ ๐๏ธ
KEY WORD
: Parametric Search
, Binary Search
, Greedy Algorithm
- 0๏ธโฃ ํต๋๋ฌด๋ฅผ ์๋ฅผ ์ ์๋ ์์น๋ฅผ ๋ฐ์์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค.
- 1๏ธโฃ
์ด๋ถํ์
์ผ๋ก ํต๋๋ฌด์ ๊ฐ์ฅ ๊ธด ์กฐ๊ฐ์ ์ต์๊ฐ์ ๊ตฌํ๋ค. ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.- 1๏ธโฃ-1)
f(w)
=๋ชจ๋ ์กฐ๊ฐ๋ ํต๋๋ฌด์ ๊ธธ์ด๊ฐ w ์ดํ์ธ๊ฐ?
๋ผ๋ ๊ฒฐ์ ๋ฌธ์ ํจ์๋ฅผ ๋ง๋ ๋ค. ์ด๋ฅผ ๋ง์กฑํ๋f(w)
์ค ๊ฐ์ฅ ์ค๋ฅธ์ชฝ์ ์๋f(w)
์ w๊ฐ ๋ฐ๋ก ๋ต์ด๋ค. (๋งค๊ฐ ๋ณ์ ํ์
) - 1๏ธโฃ-2) ํต๋๋ฌด๋ฅผ ์๋ฅผ ๋, ์ญ์์ผ๋ก, ์๋ฅผ ์ ์๋ ์์น์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ๋ถํฐ ์์ํ๋ค. (์ต์ด๋ก ์๋ฅด๋ ์์น๋ฅผ ๋ฐ๋ก ๊ณ์ฐํ์ง ์๊ธฐ ์ํจ)
- 1๏ธโฃ-3) ๋ง์ฝ ์๋ฅผ ์ ์๋ ํ์๊ฐ ๋จ์๋๋ฐ, ์ด๋ฏธ ๋ชจ๋ ์กฐ๊ฐ๋ ํต๋๋ฌด์ ๊ธธ์ด๊ฐ w ์ดํ๋ผ๋ฉด, ์ต์ด ์๋ฅด๋ ์์น๋ ์ ์ผ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐฑ์ ํ๋ค.
- 1๏ธโฃ-4) ๋ง์ฝ ์๋ฅผ ์ ์๋ ํ์๋ฅผ ๋ค ์ผ๋ค๋ฉด, ๋ง์ง๋ง ์๋ฅธ ๊ณณ์ ์ต์ด ์๋ฅด๋ ์์น๋ก ์ ์ฅํ๊ณ ๋ฉ์ถ๋ค.
- 1๏ธโฃ-1)
- 2๏ธโฃ
๋งค๊ฐ ๋ณ์ ํ์
์ผ๋ก ์ฐพ์W
์first_cut(์ต์ด ์๋ฅด๋ ์์น)
๋ฅผ ์ถ๋ ฅ ํ๋ค.
(1) ์๊ฐ๋ณต์ก๋ ๋ถ์ ๐
ํต๋๋ฌด์ ๊ธธ์ด: L
, ์๋ฅด๋ ์์น์ ๊ฐ์: K
, ์๋ฅผ ์ ์๋ ํ์: C
- ์ ๋ ฌ: $O(K \log K)$
f(w)
๊ณ์ฐ: $O(K)$- ์ด๋ถ ํ์: $O(log_2 L)$
๊ฒฐ๋ก
: $O(K \log K + log_2 L)$
K๋ ์ต๋๊ฐ์ด 10_000์ด๋ผ SAFE, L์ด 10์ต์ด๊ธด ํ์ง๋ง, $log_2 L = 29.xxx$ ๋ฐ๋ผ์ ์ด๊ฒ๋ SAFE
3. ์ฝ๋ ์๊ฐ ๐
(1) SUDO CODE
์ด๋ถํ์ {
1. mid ๊ฐ ๊ตฌํ๊ธฐ;
2. ๋ชจ๋ ์กฐ๊ฐ๋ ํต๋๋ฌด์ ๊ธธ์ด๊ฐ mid ๊ฐ ์ดํ๊ฐ ๋๋๊ฐ? = f(d) ํ์ธ;
3. ๋๋ฉด mid ์ํฅ ์กฐ์ , ์๋๋ฉด mid ํํฅ ์กฐ์
}
f(w ๋๋น,c ์๋ฅผ ์ ์๋ ํ์) = ์ด๋ถํ์ 2๋ฒ์ ํด๋นํ๋ ํจ์ {
0. prev: ์ด์ ํต๋๋ฌด ์๋ฅธ ์์น, now: ํ์ฌ ํต๋๋ฌด ์๋ฅผ ์์น;
1. ๋ชจ๋ ์๋ฅผ ์ ์๋ ์์น๋ฅผ ์ญ์์ผ๋ก ์กฐํํ๋ค. ๋ฐ๋ผ์ ํญ์ (prev > now)์ธ ์ํ์ด๋ค.;
2. prev - now <= w ์ด๋ฉด์ c(์๋ฅผ ์ ์๋ ํ์)๊ฐ ๋จ์์๋ค๋ฉด now๋ก first_cut(์ต์ด ์๋ฅด๋ ์์น) ๊ฐฑ์ ;
3. prev - now > w ๋ผ๋ฉด
c๋ฅผ ๋ค ์ป๋ค. false ๋ฐํ
now๋ฅผ ์ด์ ์์น์ ๋ค์ ๋ฌ๋ณธ๋ค. โ ๊ทธ๋๋ ์๋จ. w๋ก๋ ์๋๋ค. false ๋ฐํ;
now๋ฅผ ์ด์ ์์น๋ก ๋๋ ค ํ๋๋, ์ด์ ์์น๊ฐ ๋ ์ด์ ์๋ค. false ๋ฐํ;
now๋ฅผ ์ด์ ์์น๋ก ๋์ ๋, prev - now <= w ๊ฐ ๋๋ค๋ฉด c ํ๋ ์ฐจ๊ฐ. prev = now ๋ฃ๊ณ ๋ค์ ๋ฐ๋ณต;
4. ๋ชจ๋ ์์น๋ฅผ ๋ค ๋์๋๋ฐ ์์ง false ๋ฐํํ์ง ์์๋ค. โ w๋ ๊ฐ๋ฅํ๋ค. true ๋ฐํ
}
(2) JAVA CODE
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static long L;
static int K,C;
static long FIRST_CUT = Long.MAX_VALUE;
static long [] loc;
public static void main(String[] args) throws IOException {
// ์
๋ ฅ ๋ฐ๊ธฐ
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
L = Long.parseLong(st.nextToken());
K = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
loc = new long [K + 1];
st = new StringTokenizer(br.readLine());
for (int i = 1; i <= K; i++) {
loc[i] = Integer.parseInt(st.nextToken());
}
loc[0] = 0;
// ๊ณ์ฐ
Arrays.sort(loc);
System.out.println(binary_search() + " " + FIRST_CUT);
}
// ํต๋๋ฌด์ ๊ฐ์ฅ ๊ธด ์กฐ๊ฐ์ ์ต์๊ฐ์ ์ถ๋ ฅ
public static long binary_search () {
long start = 0;
long end = L;
while (start <= end){
long mid = start + (end - start)/2;
if(f(mid, C)) end = mid - 1;
else start = mid + 1;
// System.out.println("--------------");
}
return start;
}
// w ์ดํ๋ก ๋ชจ๋ ํต๋๋ฌด๋ฅผ ์๋ฅผ ์ ์๋๊ฐ?
public static boolean f(long w, int c){
// System.out.println("๋๋น: " + w);
long prev = L;
long first_cut = -1;
for (int i = K; i >= 0; i--) {
long now = loc[i];
if(prev - now <= w){
if(now != 0 && c > 0) first_cut = now;
}
else{
// System.out.println(now);
if(i == K) return false;
now = loc[++i];
if(prev - now <= w) {
if(c == 0) return false;
c--;
prev = now;
if(now != 0) first_cut = now;
// System.out.println("first_cut: "+first_cut);
}else return false;
}
}
FIRST_CUT = first_cut;
return true;
}
}
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
์ค ํ๋ง ํ ๋ฏ.
0