본문 바로가기

알고리즘/백준알고리즘

[백준 알고리즘/Python3] 2869 달팽이는 올라가고 싶다.

문제이해 

처음 문제를 봤을 때 등차수열 인가 싶었습니다.

 

 

등차수열의 항의 개수

등차수열에서 첫째항을 a
마지막 항을 l, 공차를d라 할 때 항의 개수n

 

a,b를 빼면 하루에 올라가는 양이 나오고 최대길이 v를 빼면 되지 않을까 생각했습니다.

 

고민은 첫째 항이였습니다.

 

a-b를 첫번째 항으로 생각하니 달팽이가 v를 도달했을 때 이상함이 나옵니다.

 

목표 길이를 도달하고도 다시 내려와야 하는 상황이 나타납니다.

 

결국 목표길이를 도달해야하는 순간은 아침입니다.

 

목표에 도달하기 직전인 상황은 (a-b) *n인 상황입니다.

 

거기에서 a만 더가면 목표에 도달할 수 있죠

 

그래서  (a-b)*n +a가 목표에 도달할 수 있는 날짜입니다.

 

n동안 날짜를 지나고 하루 +a만큼 가니깐 +1을 해줍니다.

 

 

 

 

다른사람의 풀이

날짜를 계산한는 식을 작성하기 전, 먼저 나무 높이를 기준으로 하는 식을 작성해보면 (a-b)*n +a = v와 같다. a만큼 올랐다 b만큼 떨어지기를 반복하기 때문에 a-b의 거리만큼 올라가는 것을 n만큼 반복하고 마지막 날에는 a만큼 올라가고서 더 이상 떨어지지 않기 때문이다.

 

나무높이인 v를 기준으로 작성한 식을 응용하여 나무에 도달하기까지 걸린 기간을 구하면 위에 작성한 코드와 같다. 나무높이에서 마지막 날에 올라간 거리를 뺀 수에서 a-b를 나누면 마지막에 a만큼 올라간 하루를 제외한 날짜를 구할 수 있다.

 

이때 나누는 수가 소수인 경우 소수점 이하는 날짜로 보면 하루가 걸린 것과 같기 때문에 math 모듈의 올림 기능을 하는 ceil 함수를 사용해서 소수를 올림 하여 정수로 반환한다. 그리고 마지막에 a만큼 올라간 날을 빼주어서 날짜 기준으로는 하루를 뺀 것과 같기 때문에 +1을 해주었다

출처 - https://ooyoung.tistory.com/85

 

 

코드

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

d = a-b

result = ((v-a)/d)+1
print(math.ceil(result))

map()으로 3개를 띄어쓰기 기준으로 입력받습니다.

 

공차 d는 a-b입니다.

 

등차수열의 항의 갯수 공식대로 넣었습니다.

 

결과는 소수로 나오게 됩니다.

math 를 import해서 ceil()로 감싸면 올림이 됩니다

 

728x90