https://www.acmicpc.net/problem/2110
import java.io.*;
import java.util.*;
public class Main {
static int[] home;
static int n;
static int c;
static int parametric() {
int l = 0;
int r = n - 1;
int m = 0;
while (l < r) {
m = (l + r) / 2;
if ((home[m] - home[l]) * (c - 2) <= home[r] - home[m]) { // yes
l = m + 1;
} else {
r = m - 1;
}
}
return home[m - 1] - home[0];
}
public static void main(String[] args) throws Exception {
//System.setIn(new FileInputStream("res/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
n = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
home = new int[n];
// ๊ทธ๋ํ ์ด๊ธฐํ
for (int i = 0; i < n; i++) {
home[i] = Integer.parseInt(br.readLine());
}
Arrays.sort(home);
//System.out.println(Arrays.toString(home));
System.out.println(parametric());
}
}
์ค๋ต๋ ธํธ(ํธ๋ ๋์ ์ฌ๊ณ ๊ณผ์ ๋ฐ ๊ฐ์ ์ )
ํ๋ผ๋ฉํธ๋ฆญ ์์น๋ผ๋ ๊ฐ๋ ์ ์ฒ์ ์๊ฒ ๋๋ค.
ํ๋ผ๋ฉํธ๋ฆญ ์์น๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์ ๋ฆฌํ๋ฉด ๊ฒฐ์ ์กฐ๊ฑด์ด ์ถ๊ฐ๋ ์ด๋ถํ์์ด๋ค. ์ด๋ถํ์์ด ํฐ ๋ฒ์, ์์ ๋ฒ์๋ฅผ ์ขํ๊ฐ๋ฉฐ logN์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ธ๋ฐ ์ด๋ ๋ฒ์๋ฅผ ์ขํ ์กฐ๊ฑด์ ์ถ๊ฐํ ๊ฒ ํ๋ผ๋ฉํธ๋ฆญ ์์น๋ผ๋ ๊ฐ๋ ์ด๋ค.
์ด๋ถ ํ์์ ๋ค์ ์๊ฐํด๋ณด์. m = (l + r) /2 ์ผ๋ก, m์ด ์ปค์์ผ ๋
m์ด ํ๊ฒ๋ณด๋ค ์์ผ๋ฉด -> l์ m+1๋ก ๋ก๊ฒจ์ค๊ณ
m์ด ํ๊ฒ๋ณด๋ค ํฌ๋ฉด -> r์ m-1๋ก ๋ก๊ฒจ์จ๋ค
์ด๋ m๊ณผ ํ๊ฒ์ ๋น๊ตํ๋ ๋ถ๋ถ์ ๋ผ๋ค๊ฐ ๋ด๊ฐ ์ฐพ์์ผ๋๋ ์กฐ๊ฑด์ผ๋ก ๋ฐ๊พธ๋ฉด ์์ฑ์ด๋ค.
์ค๋ต์ดํ ๋ด๊ฐ ๋ง๋ ์กฐ๊ฑด์ ์๋์ ๊ฐ๋ค.
static int count(int m) { // ๊ณต์ ๊ธฐ ๊ฐ์ ์ธ๊ธฐ
int cnt = 1; // ์์์ ์ ์ค์นํ๊ณ ์์ํจ.
int prev = home[0];
for (int i = 1; i < n; i++) {
int d = home[i] - prev; // ํ์ฌ ์ง์ ๋ถํฐ i๋ฒ์งธ ์ง๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๊ธฐ
if (d >= m) { // m๋ณด๋ค ํ์ฌ ๊ฑฐ๋ฆฌ๊ฐ ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด ๊ณต์ ๊ธฐ๋ฅผ ๋๊ณ ๊ฑฐ๋ฆฌ ๊ฐฑ์
cnt++;
prev = home[i]; // ์ด๋ฌ๋ฉด ๋ค์ ๊ฐฑ์ ๋ ๊ฑฐ๋ฆฌ๋ ๋์ด๋๊ฒ ๋จ -> c๋งํผ ๊ณต์ ๊ธฐ ์ค์นํ๋ฉด ์ต์ฅ๊ฑฐ๋ฆฌ ์์ฑ
}
}
return cnt;
}
cnt๊ฐ ์ค์นํ ์ ์๋ ๊ณต์ ๊ธฐ ๊ฐ์๋ค. ๊ณต์ ๊ธฐ๋ฅผ C๊ฐ ๋งํผ ์ค์นํ ์ ์์ผ๋ฉด ๊ทธ๊ฒ ์ข ๋ฃ ์กฐ๊ฑด์ด ๋ ์ ์๋๋ฐ ๊ทธ๊ฑด ์ด count ํจ์๋ฅผ ๋๋ฉด์ ๊ฒฐ์ ํ๋ค.
ํ๋ผ๋ฏธํฐ๋ก m์ด ๋ค์ด์ค๋ฉด ์ด๋ m์ ๊ณต์ ๊ธฐ๋ฅผ ์ค์นํ๊ธฐ์ํด ์ด๋ํ ์์ ๊ฑฐ๋ฆฌ๋ค.
์ ๋ต์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
static int[] home;
static int n;
static int c;
static int count(int m) { // ๊ณต์ ๊ธฐ ๊ฐ์ ์ธ๊ธฐ
int cnt = 1; // ์์์ ์ ์ค์นํ๊ณ ์์ํจ.
int prev = home[0];
for (int i = 1; i < n; i++) {
int d = home[i] - prev; // ํ์ฌ ์ง์ ๋ถํฐ i๋ฒ์งธ ์ง๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๊ธฐ
if (d >= m) { // m๋ณด๋ค ํ์ฌ ๊ฑฐ๋ฆฌ๊ฐ ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด ๊ณต์ ๊ธฐ๋ฅผ ๋๊ณ ๊ฑฐ๋ฆฌ ๊ฐฑ์
cnt++;
prev = home[i]; // ์ด๋ฌ๋ฉด ๋ค์ ๊ฐฑ์ ๋ ๊ฑฐ๋ฆฌ๋ ๋์ด๋๊ฒ ๋จ -> c๋งํผ ๊ณต์ ๊ธฐ ์ค์นํ๋ฉด ์ต์ฅ๊ฑฐ๋ฆฌ ์์ฑ
}
}
return cnt;
}
static int parametric() {
int l = 0;
int r = home[n - 1] - home[0];// ์ต๋ ๊ฑฐ๋ฆฌ -> ์ฌ๋ ์์น ์๊ฐ ์๋๋ผ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ก๋๋ค.
int ans = 0;
while (l <= r) {
int m = (l + r) / 2;
int cnt = count(m);
if (cnt >= c) { // ๊ณต์ ๊ธฐ ๋๋ฆด ์ ์์
ans = m;
l = m + 1;
} else { // ๊ณต์ ๊ธฐ ์ค์ฌ์ผ ํจ
r = m - 1;
}
}
return ans;
}
public static void main(String[] args) throws Exception {
//System.setIn(new FileInputStream("res/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
n = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
home = new int[n];
// ๊ทธ๋ํ ์ด๊ธฐํ
for (int i = 0; i < n; i++) {
home[i] = Integer.parseInt(br.readLine());
}
Arrays.sort(home);
//System.out.println(Arrays.toString(home));
System.out.println(parametric());
}
}
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์! ๋ก๊ทธ์ธ ์ํด๋ ๋ฉ๋๋ค ^_^
'OJ๐ผ > ์ค๋ต๋ ธํธ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][JAVA] 7576๋ฒ : ํ ๋งํ (0) | 2024.03.19 |
---|---|
[BOJ][JAVA] 17822๋ฒ: ์ํ๋๋ฆฌ๊ธฐ (0) | 2024.03.17 |
[BOJ][JAVA] 1717๋ฒ: ์งํฉ์ ํํ, 1976๋ฒ: ์ฌํ๊ฐ์ (0) | 2024.03.03 |
[BOJ][JAVA] 17070๋ฒ: ํ์ดํ ์ฎ๊ธฐ๊ธฐ 1 (0) | 2024.03.03 |
[SWEA][JAVA] 1949. [๋ชจ์ SW ์ญ๋ํ ์คํธ] ๋ฑ์ฐ๋ก ์กฐ์ฑ (0) | 2024.03.01 |