본문 바로가기

알고리즘

백준 2869 달팽이는 올라가고 싶다 [개인적인 풀이 과정]

a, b, v = map(int, input().split())
height = 0
day = 0

while height < v-a:
    height += a-b
    day += 1
print(day+1)

a, b, v 를 인풋으로받고 반복문을 돌며 

달팽이의 높이를 매일마다 a-b씩 더해줬다.

높이가 v-a보다 작을 경우에만 와일문이 작동하도록 조건을 걸어줬다.

 

하루가 온전 히 지날 때 마다 달팽이의 높이는 a-b씩 증가하게 된다.

달팽이의 높이가 v가 된 순간은 그 날에 a만큼 오르고 b만큼 내려간 순간이 아니다.

a만큼 오른 것만 계산한 순간이다.

따라서 마지막날 달팽이의 높이 height == (a-b)day+a가 된다.

(a-b)day에서 +a를 한 값이 day에 하루를 더한값 이기 때문에 print(day+1)을 해줬다.

 

while로 풀이 한 결과 값이 작을 경우는 상관없었으나 값이 커지면 커질 수록 결과가 출력되기까지 시간이 많이 소요되었다.

구글링 결과 조건문이나 반복문 없이도 바로 값을 구할 수 있다고 해서 수식을 써봤다.

day를 달팽이가 v에 도달한 날 이라고 정의하면 다음과 같이 나온다.

 

v = day(a) - (day - 1)*b                       (마지막 날은 미끄러질 필요가 없다.)

v = day(a-b)+b                                   

v-b = day(a-b)                            

day = v-b/a-b    

 

하지만 이렇게 바로 day를 출력하면 실수 값이 나올 때가 있는데 실수 값이 나오는 경우는 하루가 더 지나야 달팽이가 원하는 위치까지 갈 수 있기 때문에 올림을 사용하여 출력한다.

import math
a, b, v = map(int, input().split)                 
day = (v - b) / (a - b)                             # 정리되어 나온 day의 값. 정수 또는 실수
print(math.ceil(day))   # import math할 시 쓸 수 있는 올림! math() 괄호 안의 수를 올림한다.

정답 제출을 위한 코드는 정말 짧다... 오랜 시간 고민하고 노력한게 고작 4줄 만으로 가능하다니 놀랍다!