프론트엔드 개발자 중규리 입니다 ദി ᷇ᵕ ᷆ ) 자세히보기

PS/문제풀이

백준 1166 선물 Python

중규리 2024. 1. 8. 11:20

🐸 문제 정보

 

1166번: 선물

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

www.acmicpc.net

 

🤖 알고리즘

이분탐색

 

⏱️ 풀이 시간

26.04m

 

📝 풀이

처음에 수학 문제라고 확신하고 풀었다.

이유는 (L / A) * (W / A) * (H / A) = N인 경우의 A 값을 찾으면 되니까... 하고 풀었으나 실패.

결국 검색의 힘을 빌렸고, 이분탐색 문제인 것을 알았다.

 

  1. start는 0, end는 L, W, H 중 가장 큰 값을 선택
  2. end의 최대 값과 비교했을 때 반복문 100번 정도 돌리기 가능 (2 ^ 100)
  3. 블럭 개수는 (L / A) * (W / A) * (H / A)
    • 이 개수가 N보다 크거나 같다면 start = 블럭개수
    • N보다 작다면 end = 블럭개수

 

사실 이분탐색 문제는 아직도 어렵다.

DP가 점화식을 찾는게 어렵다면, 이분탐색은 어떤 경우에 이분탐색으로 풀어야하는지 잘 모르겠다.

오늘은 이분탐색을 부숴야겠다.

 

🧑‍💻 나의 답

# pypy3

import sys
input = sys.stdin.readline

n, l, w, h = list(map(int, input().rstrip().split()))
start, end = 0, max(l, w, h)

for _ in range(100):
    mid = (start + end) / 2
    cnt = (l // mid) * (w // mid) * (h // mid)
    if cnt >= n:
        start = mid
    else:
        end = mid

print(f"{end:.10f}")

'PS > 문제풀이' 카테고리의 다른 글

백준 1062 가르침 Python  (0) 2024.01.08
백준 1174 줄어드는 수 Python  (1) 2024.01.08
백준 2512 예산 Python  (1) 2024.01.07
백준 17266 어두운 굴다리 Python  (1) 2024.01.07
백준 3165 5 Python  (1) 2024.01.06