알고리즘 공부/백준

(Python)백준 코딩테스트 연습 - 선물(1166)

HRuler 2023. 1. 28. 19:41

1. 문제

https://www.acmicpc.net/problem/1166

 

1166번: 선물

민식이는 아이들에게 선물할 같은 크기의 작은 박스를 N개 가지고 있다. 모든 작은 박스는 정육면체이고, 크기는 A × A × A 이다. 민식이는 이 작은 박스를 크기가 L × W × H 인 직육면체 박스에

www.acmicpc.net

2. 풀이

import sys
input = sys.stdin.readline


# n : 들어갈 작은 박스 수, l : 직육면체 길이, w : 직육면체 너비, h : 직육면체 높이
n, l, w, h = map(int, input().split())
min_f = min(l, w, h)
i = 0
if n <= (l // min_f) * (w // min_f) * (h // min_f):
    print(min_f)
else:
    mi = 0
    ma = min_f
    for i in range(30000):
        #print("mi :", mi, "ma :", ma)
        mid = (mi + ma) / 2
        avail = (l // mid) * (w // mid) * (h // mid)
        if avail >= n:
            mi = mid
        else:
            ma = mid
    #print(mi + ma)
    print("{:.9f}".format((mi + ma) / 2))

 

3. 후기

 - 이 문제는 다른 실버 3단계의 문제들보다 어려웠다.

 여러번에 '틀렸습니다'와 '런타임 오류(Recursion Error)'들을 받은 끝에 맞출 수 있었다.

 이 문제 해결의 가장 큰 문제는 이분 탐색을 어느 시점에 중지하여 리턴해줄지에 대한 것이었고, 각 문제의 조건마다 적절한 리턴 조건이 있어야 한다는 것을 생각해볼 수 있는 문제였다.