백준 선물

KIMYEONGJUN·2024년 12월 14일
1
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에 네 정수 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();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글