백준 2869_달팽이는 올라가고 싶다 / Python

2023. 4. 12. 20:26백준

문제

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

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

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

입력

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

출력

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


## 2869 달팽이는 올라가고 싶다
a,b,v=map(int,input().split())
current,day=0,0
while current<v-b:
  current+=a
  current-=b
  day+=1
print(day)

현재위치를 막대의 길이랑 계속 비교해 주면서 갱신하는 코드를 짰는데 낮에 도착하는 경우를 생각못해서 틀렸다고 뜬다. 

a,b,v=map(int,input().split())
current,day=0,0
while True:
  if current>=v:
    print(day)
    break
  else:
    current+=a
    if current>=v:
      day+=1
      print(day)
      break
    current-=b
    day+=1

낮에 움직이고 나서도 한 번 조건을  확인하도록 수정했는데 막대의 길이가 많이 길면 엄청 오래 걸린다..


그래서 수학적으로 접근했음.

낮에 도착하는 경우가 있을 수도 있으니까 막대의 길이를 그냥 b만큼 빼주고 시작한다.

하룻동안 (a-b)만큼 올라간다. 그러면 걸리는 시간은 (v-b)/(a-b)일 이다. 하지만 나누어 떨어지지 않는 경우는 하루를 더 가줘야 함으로 math라이브러리를 이용해 올림함수 ceil()을 사용해준다.

import math
a,b,v=map(int,input().split())

min(math.ceil(v/(a-b)),math.ceil((v-b)/(a-b)))

1. 밤까지 이동해서 도달하는 경우 v/(a-b)

2. 낮까지 이동해서 도달하는 경우 (v-b)/(a-b)

*안나누어떨어질 경우 하루 더 가야 하니까 math.ceil()해주고 min()으로 더 빨리 도착하는 날로 출력.

근데 틀림.. 질문게시판에 나와있는 다른 반례들 다 해봤는데 답은 다 맞게 나왔다... 반례를 결국 못찾았지만 자꾸 틀렸다고 하니까.. 

 

그래서 생각해보니 ceil해줄거면 굳이 1, 2경우를 나누어줄 필요가 없고 처음부터 v-b를 나누어 주면 될 것 같아서 해보니까 맞았다! 

(그래도 위에 코드는 뭐가 틀렸는지 모르겠다..)

import math
a,b,v=map(int,input().split())

print(math.ceil((v-b)/(a-b)))

코드길이는 짧은데 시간이 오래걸린다. 이유는! 모르겠다!