[백준] 1166 선물 자바

차누·2023년 8월 30일
0

실버3 문제

문제

민식이는 아이들에게 선물할 같은 크기의 작은 박스를 N개 가지고 있다. 모든 작은 박스는 정육면체이고, 크기는 A × A × A 이다. 민식이는 이 작은 박스를 크기가 L × W × H 인 직육면체 박스에 모두 넣으려고 한다. 모든 작은 박스는 큰 박스 안에 있어야 하고, 작은 박스의 변은 큰 박스의 변과 평행해야 한다.
N, L, W, H가 주어질 때, 가능한 A의 최댓값을 찾는 프로그램을 작성하시오.

입력

첫째 줄에 네 정수 N, L, W, H가 주어진다.

출력

첫째 줄에 가능한 A의 최댓값을 출력한다. 절대/상대 오차는 10-9까지 허용한다.

풀이방법

  1. 최대값은 L,W,H값 중 가장 작은 값을 최소값으로 한다.
    2.high == mid && low == mid로 설정 (무한반복 방지를 위해)
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()로 값이 어떻게 변하는지 하나하나 살펴가며 보니깐 이해하기 훨씬 편했다. 앞으로 더 많은 문제를 풀어볼 예정이다.

profile
to be good programmer

0개의 댓글