시간 제한메모리 제한제출정답맞힌 사람정답 비율
0.25 초 (추가 시간 없음)128 MB297047957257682431.706%

문제

땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.

달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.

달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)

출력

첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.

풀이

  • 기본 반복문 안 됨 → 시간 초과(시간 제한을 보면 0.25로 굉장히 짧은 걸 알 수 있다.)
  • 기본 수학으로 풀기 안 됨 → 그냥 하루에 이동하는 거리 분에 전체 거리(V/(A-B))로 풀 수 없음
    • 포인트는 “정상에 올라간 후에는 미끄러지지 않는다”는 점
    • 하루의 마지막 그러니까 정상에 도달했는지를 체크하는 시기를 A만큼 올라간 직후로 잡으면 됨
      • 기존의 수식(V/(A-B))은 올라갔다 B만큼 내려갔을 때 정상에 도달했는지를 체크함
      • 미리 A만큼 올려둬서(V -= A) (-B +A)를 한싸이클로 두면 됨.
      • 다르게 표현하면 첫째날 밤부터 시작하는 거임.
import math  
  
A, B, V = map(int, input().split())  
  
V -= A  # 끝에 도달했는지 검증하는 시기가 올라간 직후니까. 이걸 해주지 않으면 내려간 후에 검증을 하게됨. 대신 이후에 하루 더해줘야함.  
  
q = math.ceil(V/(A-B)) # 내려갔다 올라갔다를 며칠씩 하는지. => A-B = 하루에 움직이는 거리  
  
print(q + 1)
  • 추가적으로 A 대신 B를 빼주는 경우가 있는데, 어떤 로직인지 이해를 다 하진 못함.
    • ((V - B - 1) // (A - B) + 1)
    • GPT 참고 링크
    • N일 째 밤에 V-B에 도달한거면, N일 째 낮에는 V에 도달한 거니까!

Computer #PS