| 시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
|---|---|---|---|---|---|
| 0.25 초 (추가 시간 없음) | 128 MB | 297047 | 95725 | 76824 | 31.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