실버3 문제
민식이는 아이들에게 선물할 같은 크기의 작은 박스를 N개 가지고 있다. 모든 작은 박스는 정육면체이고, 크기는 A × A × A 이다. 민식이는 이 작은 박스를 크기가 L × W × H 인 직육면체 박스에 모두 넣으려고 한다. 모든 작은 박스는 큰 박스 안에 있어야 하고, 작은 박스의 변은 큰 박스의 변과 평행해야 한다.
N, L, W, H가 주어질 때, 가능한 A의 최댓값을 찾는 프로그램을 작성하시오.
첫째 줄에 네 정수 N, L, W, H가 주어진다.
첫째 줄에 가능한 A의 최댓값을 출력한다. 절대/상대 오차는 10-9까지 허용한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
public class backjoon{
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 low = 0;
//큰 상자중 가장 최소값을 최대값으로 정한다
double high = Math.min(L,Math.min(W,H));
double mid = 0;
//1부터 시작
while(low < high) {
mid = (low + high) / 2;
if((long) (L / mid) * (long)(W / mid) * (long)(H / mid) < N) {
if(high == mid) break;
high = mid;
}
else {
if(low == mid) break;
low = mid;
}
}
System.out.println(low);
}
}
문제 푼 후기
실버3 문제부터는 응용이 들어간다. 문제도 이해 해야하고 코드도 어떻게 동작하는지 잘 알아야 풀기 쉽다는걸 알게 되었다. 그래서
While문 안에 System.out.print()로 값이 어떻게 변하는지 하나하나 살펴가며 보니깐 이해하기 훨씬 편했다. 앞으로 더 많은 문제를 풀어볼 예정이다.