๋ฌธ์
ํด๋น ํฌ์คํ ์ ๋ฐฑ์ค์ 1654๋ฒ ๋์ ์๋ฅด๊ธฐ ์ ์ ๊ทผ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ค๋ช ํ ๊ธ ์ ๋๋ค.
์ ๋ต ์์ค ์ฝ๋๋ฅผ ํ์ธํ์๋ ค๋ฉด solve url ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ๊ทผํด์ผ ํ๋์ง๋ฅผ ๋จผ์ ์๊ฐํด๋ณด์.
๋ฌธ์ ์ ๊ทผ
๋ฌธ์ ์์ ์ํ๋ ๋ด์ฉ์ ํ ๋ฌธ์ฅ์ผ๋ก ๋ง ํ์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
K๊ฐ์ ๋์ ์ N๊ฐ๋ก ๋๋์ด ์๋ฅผ ๋, ๊ฐ ๋์ ์ ๊ธธ์ด๊ฐ ์ต๋๊ฐ ๋๋ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ผ.
๊ทธ๋ผ ์ฐ์ , ์๋ฌด๋ฐ ์๊ฐํ์ง ๋ง๊ณ K๊ฐ์ ๋์ ์ N๊ฐ๋ก ๋๋์ด์ ์๋ฅผ ๋ ์ต๋์ ๊ธธ์ด๋ฅผ ๊ตฌํด๋ณด์.
์ด๋ ํ ์๊ณ ๋ฆฌ์ฆ์ด ์๊ฐ๋์ง ์์๋ ์ข๋ค.
์๋ ์๊ฐํ์ง ๋ง๊ณ ํ ๋ฒ ์ง๋ณด์.
public static void main(String[] args) {
int k = 4;
int n = 11;
int[] arr = {802, 743, 457, 539};
Arrays.sort(arr);
int quotient = 1;
int answer = 1;
while(quotient++ < arr[arr.length-1]) {
int count = 0;
for(int value : arr) {
count += value / quotient;
}
if(n == count) { // n๊ณผ ๊ฐ์ผ๋ฉด์ ๋๋์ด ๋จ์ด์ง๋ ์ต๋๊ฐ
answer = quotient;
}
}
System.out.println(answer); // 200
}
๊ทธ๋ผ ์ฐ๋ฆฌ๊ฐ ์ฐพ๋ 200์ด๋ผ๋ ์๊ฐ ์ฐพ์์ง๊ฒ ๋๋ค.
๊ทธ๋ผ ์ด๊ฒ ๋ต์ผ๊น?
์ฐ์ ๋ ผ๋ฆฌ์ ๋ํ ๊ฒ์ฆ๋ถํฐ ํด๋ณด์.
๋ชซ์ 1 ~ ์ ๋ ฅ ๋ฐฐ์ด์ ์ต๋๊ฐ ๊น์ง 1์ฉ ์ฆ๊ฐํ๋ฉฐ ๋๋์์ ๋, ์ฐ๋ฆฌ๊ฐ ์ํ๋ n๊ฐ์ ๋์ ์ด ๋ ์ต๋ ๊ฐ์ ๊ตฌํ๋ ๋ก์ง์ด๋ค.
์ฌ์ค์ ๋ก์ง์๋ ๋ฌธ์ ๊ฐ ์์ด ๋ณด์ธ๋ค.
๋ก์ง์ ํต๊ณผํ๋ค. ํ์ง๋ง?
๊ทธ๋ผ ์ด์ ๊ฐ์ฅ ์ค์ํ ์๊ฐ ๋ณต์ก๋๋ฅผ ์๊ฐํด๋ณด์.
์
๋ ฅ k๋ 1 ~ 10,000
์ฌ์ด์ ๊ฐ์ด๋ค. ๊ทธ๋ฆฌ๊ณ N์ 1 ~ 1,000,000
์ดํ์ ์ ์๋ผ๊ณ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋์ ์ ๊ธธ์ด๋ 2^31
์ฆ 21์ต cm์ ๊ธธ์ด๊ฐ ๋๋ค๊ณ ํ๋ค.
์ต์ ์ ๊ฒฝ์ฐ 21์ต๋ฒ ๋ฐ๋ณต์ ๋์์ผ ํ๋ฏ๋ก ์๊ฐ๋ณต์ก๋์์ ์คํจ
๊ทธ๋ผ ์ด๋ป๊ฒ ํด์ผํ ๊น?
์ง๊ธ๊น์ง ๋ณด๋ฉด ์ด์ฉ ์ ์์ด 1๋ถํฐ 21์ต์ ๊ธธ์ด๋ฅผ ํ์ํด์ผ ํ ๊ฒ ๊ฐ๋ค.
ํ์ง๋ง ์กฐ๊ธ ์๊ฐ์ ํด๋ณธ๋ค๋ฉด 1๋ถํฐ 21์ต ๊น์ง์ ํ์์ ์ ๋จน์ผ๋ฉฐ ์์ฃผ ํ๋ ์
๋ค์ด ๊ฒ์ ๋ฐฉ์์ผ๋ก ์ค์ผ ์ ์์ง ์์๊น?
๋ง๋ค.
์ด ์
๋ค์ด ๊ฒ์ ์์ฒด๋ ์ด๋ถ ํ์์ผ๋ก ์ต์ ํ ํ ์ ์์ผ๋ฏ๋ก ์ด ๋ฌธ์ ๋ ์ด๋ถ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
ํด๊ฒฐ๋ฒ
์์ ๋ง ํ๋ฏ, ์
๋ ฅ์ผ๋ก ๋ค์ด์ค๋ ๋ฐฐ์ด arr
์ ์์๋ฅผ ๋๋ ๋ชซ๋ค์ ํฉ์ด ๋ฐ๋ก ๋์ ์ ๊ฐฏ์๊ฐ ๋๋ค.
๊ทธ๋ผ ์ฐ๋ฆฌ๊ฐ ๋ง๋๋ ์๊ณ ๋ฆฌ์ฆ์ arr ์ ์์๋ฅผ x๋ก ๋๋ด์ ๋, ๋ชซ๋ค์ ํฉ์ด n์ด ๋๋ x
๋ฅผ ์ฐพ๊ธฐ ์ํ ๊ณผ์ ์ด ๋ ๊ฒ์ด๊ณ , ์ด ํ๋ณด๋ค์ ์ด๋ถ ํ์ํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
x์ ํ๋ณด
์ฐ๋ฆฌ๋ ์ด x์ ๋ฒ์๋ 1์์ ๋ฐฐ์ด ํญ๋ชฉ์ ์ต๋๊ฐ์ธ 802 ๊น์ง๊ฐ ๋๋ค.
์ด๋ค์ ๋ฐ์ฉ ์ค์ฌ๊ฐ๋ฉฐ ํน์ ๋๋ ค๊ฐ๋ฉฐ ์ด๋ถ ํ์์ ์๋ํ๋๋ฐ, ๋๋ฆฌ๊ณ ์ค์ด๊ณ ๋ฅผ ์ด๋ป๊ฒ ๊ฒฐ์ ํ ๊น?
๊ธธ์ด x๋ก ์๋ฅธ ๋์ ๋ค์ ๊ฐฏ์๊ฐ n๋ณด๋ค ํฌ๊ฑฐ๋ ์๊ฑฐ๋๋ก ๋๋ ์ ์์ง ์์๊น?
- ๊ธธ์ด x๋ก ์๋ฅธ ๋์ ๋ค์ ๊ฐฏ์๊ฐ n๋ณด๋ค ํด ๋ : x๋ก ์๋๋๋ ๋์ ์ด ๋ ๋ง์์ก๋ค? => x๋ณด๋ค ๋ ํฐ ๊ธธ์ด๋ก ์๋ผ์ผ ํ๋ค.
- ๊ธธ์ด x๋ก ์๋ฅธ ๋์ ๋ค์ ๊ฐฏ์๊ฐ n๋ณด๋ค ์์ ๋ : x๋ก ์๋๋๋ ๋์ ์ด ๋ ์ ์ด์ก๋ค? => x๋ณด๋ค ๋ ์์ ๊ธธ์ด๋ก ์๋ผ์ผ ํ๋ค.
์ด ์กฐ๊ฑด์ ํตํด์ ์ด๋ถ ํ์์ start์ end๋ฅผ ๋งค ๋ฐ๋ณต๋ง๋ค ์ฌ์ ์ ํด์ฃผ๋ฉด ๋๋ค.
์ ๋ต ์ฝ๋
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] kn = br.readLine().split(" ");
int k = Integer.parseInt(kn[0]);
int n = Integer.parseInt(kn[1]);
long[] arr = new long[k];
long max = 0;
for(int i = 0; i < k; i++) {
arr[i] = Long.parseLong(br.readLine());
max = Math.max(max, arr[i]);
}
long start = 1;
long end = max;
long answer = 0;
while(start <= end) {
int count = 0;
long mid = start + (end - start) / 2; // ๋๋ ๊ฐ
for(int i = 0; i < arr.length; i++) {
count += arr[i] / mid;
}
if(count >= n) {
answer = Math.max(answer, mid);
start = mid + 1;
}else {
end = mid - 1;
}
}
bw.write(String.valueOf(answer));
bw.flush();
bw.close();
}
}
๋ฌธ์ ํ๊ณ
์ด๋ถ ํ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์๋ ์ฒซ ๋ฌธ์ ์ด๋ค.
์ด๋ก ์์ ์ด๋ถ ํ์์ ์ง์ ๋ ๋ฆฌ์คํธ ๋ด์์ ๋ถํ ์ ๋ณต์ ํ๋ค๊ณ ์ดํดํ๋๋ฐ, ํ์ ๋ฐํ์์ด์ ๊ณ์ ์ ๋ ฅ์ผ๋ก ๋ค์ด์จ arr ์ด๋ผ๋ ๋ฆฌ์คํธ ๋ด์์๋ง ์๊ฐ์ ํ๊ฒ ๋์๋ค.
arr ๋ฆฌ์คํธ ๋ด์์ ์ด๋ป๊ฒ mid ๊ฐ์ ์ฐพ์์ง๋ฅผ ๊ณ ๋ฏผํ๋๋ฐ, ์ฌ์ค์ ์ด๋ถ ํ์์ ํด์ผํ ๋ฆฌ์คํธ ์์ฒด๊ฐ ๋ฌ๋๋ค.
์ด๋ถ ํ์์ ํด์ผํ ๋ฆฌ์คํธ๋ 1 ~ arr์ ์ต๋๊ฐ ๊น์ง ๋๋๋ ค ํ๋ ๊ฐ์ ๋ฆฌ์คํธ ์์๋ค.
ํ์คํ ์๊ณ ๋ฆฌ์ฆ PS๋ ๋ง์ ๋ฌธ์ ๋ฅผ ํ์ด๋ด์ผ ํ ๊ฒ ๊ฐ๋ค.
๋๊ธ