내가 생각했을때 문제에서 원하는부분
첫째 줄에 네 정수 N, L, W, H가 주어진다.
첫째 줄에 가능한 A의 최댓값을 출력한다.
절대/상대 오차는 10-9까지 허용한다.
내가 이 문제를 보고 생각해본 부분
BufferedReader를 사용하여 한 줄의 입력을 읽어준다.
StringTokenizer를 이용해 입력된 문자열을 공백을 기준으로 분리하여 각 변수에 할당한다.
N: 작은 박스의 개수
L: 큰 박스의 길이
W: 큰 박스의 너비
H: 큰 박스의 높이
이진 탐색을 위한 변수 초기화:
start: 가능한 최대 크기의 시작점 (0)
end: 가능한 최대 크기의 끝점 (큰 박스의 가장 긴 변)
이진 탐색 루프:
10,000번의 반복을 통해 이진 탐색을 한다.
mid는 현재 탐색하고 있는 정육면체의 변의 길이이다.
박스 개수 계산 및 조건 비교:
(L / mid), (W / mid), (H / mid)는 각각 큰 박스의 길이, 너비, 높이에 대해 정육면체가 몇 개 들어갈 수 있는지를 계산한다.
이 값들을 곱하여 전체 들어갈 수 있는 박스의 개수를 구한다.
만약 이 개수가 ( N )보다 크거나 같으면, start를 mid로 업데이트하여 더 큰 크기를 탐색합니다. 그렇지 않으면 end를 mid로 업데이트하여 더 작은 크기를 탐색한다.
최종적으로 start 값을 출력한다.
이는 가능한 최대 정육면체의 크기이다.
코드로 구현
package baekjoon.baekjoon_25;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// 백준 1166번 문제
public class Main867 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int L = Integer.parseInt(st.nextToken());
int W = Integer.parseInt(st.nextToken());
int H = Integer.parseInt(st.nextToken());
double start = 0;
double end = Math.max(L, Math.max(W, H));
// 이분탐색
for(int i = 0;i < 10000;i++) {
double mid = (start + end) / 2; // 정육면체의 한 변의 길이
// 직육면체에 들어갈 수 있는 정육면체의 개수 구해 n과 비교
if((long)(L / mid) * (long)(W / mid) * (long)(H / mid) >= N) {
start = mid;
} else {
end = mid;
}
}
System.out.println(start);
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.