백준 1166번
https://www.acmicpc.net/problem/1166
재귀
반복문
재귀
import java.io.*;
import java.util.StringTokenizer;
public class Main {
private static int N, L, W, H;
private static double result = 0;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
L = Integer.parseInt(st.nextToken());
W = Integer.parseInt(st.nextToken());
H = Integer.parseInt(st.nextToken());
sb.append(binarySearch(0.0, Math.max(L, Math.max(W, H)), 0));
bw.write(sb.toString());
bw.close();
} // End of main
private static double binarySearch(double low, double high, int count) {
if (low > high || count == 60) {
return low;
}
double mid = (low + high) / 2.0;
if (check(mid)) {
low = mid;
double temp = binarySearch(low, high, count + 1);
if (temp == -1) {
return low;
} else {
return temp;
}
} else {
high = mid;
return binarySearch(low, high, count + 1);
}
} // End of binarySearch
private static boolean check(double mid) {
if ((long) (L / mid) * (long) (W / mid) * (long) (H / mid) >= N) {
// check가 true이면, low = mid가 됨 (기준 높임).
return true;
} else {
// check가 false이면, high = mid가 된다 (기준 내림).
return false;
}
} // End of check
} // End of Main class
반복문
import java.io.*;
import java.util.StringTokenizer;
public class Main {
private static int N, L, W, H;
private static double result = 0;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
L = Integer.parseInt(st.nextToken());
W = Integer.parseInt(st.nextToken());
H = Integer.parseInt(st.nextToken());
sb.append(binarySearch(0.0, Math.max(L, Math.max(W, H))));
bw.write(sb.toString());
bw.close();
} // End of main
private static double binarySearch(double low, double high) {
for (int i = 0; i < 10000; i++) {
double mid = (low + high) / 2.0;
if ((long) (L / mid) * (long) (W / mid) * (long) (H / mid) >= N) {
low = mid;
} else {
high = mid;
}
}
return low;
} // End of binarySearch
} // End of Main class