[백준] 2869. 달팽이는 올라가고 싶다

방법이있지·2025년 5월 17일

백준 / 브론즈 1 / 2869. 달팽이는 올라가고 싶다

  • 우와...! 무려 VV의 최댓값이 1,000,000,000
  • 심지어 시간제한이 0.25초다. 이 정도 크기면 O(N)O(N)으로 풀어도 시간초과 뜸.
  • 이걸 O(1)O(1)으로 풀어요?? 하지만 방법이 있즤~~

풀이

식 세우기

  • 달팽이가 VV미터의 나무 막대를 다 올라갔을 때, xx일이 걸렸다고 가정. 우리는 xx의 최솟값을 찾아야 함
  • 달팽이는 낮에 AA미터 올라가고 밤에 BB미터 떨어짐 -> 하루에 (AB)(A-B)미터 올라감
  • 하지만 마지막 날에는 AA미터 올라가고 목표에 도달 -> 마지막 날은 AA미터 올라감
  • 즉 달팽이는 (x1)(x-1)일 간 (AB)(A-B)미터만큼, 1일 간 AA미터만큼 올라감
  • 올라간 총 높이가 VV미터 이상이어야 함

정리해서, 아래와 같은 부등식을 세울 수 있음

(AB)(x1)+AV(A - B)(x - 1) + A \geq V (단, xx는 자연수)

식 정리하기

xx를 기준으로 항을 정리하면,

  1. (AxBxA+B+A)V(Ax - Bx - A + B + A) \geq V

  2. (AB)x+BV(A - B) x + B \geq V

  3. (AB)x(VB)(A - B) x \geq (V - B)

  4. x(VB)(AB)x \geq \frac{(V - B)}{(A - B)} (A>BA > B이므로 나누어도 부등호는 바뀌지 않음)

(VB)(AB)\frac{(V - B)}{(A - B)} 이상인 자연수 xx 중 최솟값을 구하면 되는데, 해당 값을 올림해 주면 됨 (math.ceil() 사용)

import math

A, B, V = map(int, input().split())

answer = math.ceil((V - B) / (A - B))
print(answer)

시간 복잡도

  • 단순 계산이므로 O(1)O(1)
  • 시간제한이 비정상적으로 짧으면 뭔가 신박한 풀이로 풀어야 함

기억할 점

  • 달팽이는 해롭다.
profile
뭔가 만드는 걸 좋아하는 개발자 지망생입니다. 프로야구단 LG 트윈스를 응원하고 있습니다.

0개의 댓글