백준 선물

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개의 댓글

관련 채용 정보