본문 바로가기

PS/백준

[백준 2869번 ] 달팽이는 올라가고싶다 (파이썬/python)

728x90

https://www.acmicpc.net/problem/2869

 

2869번: 달팽이는 올라가고 싶다

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

www.acmicpc.net

 

조건이 좋아서 반복문 만으로 풀 수가 있었으면 좋았겠지만

애초에 반복문 쓰지 말고 수학적 계산으로 풀라고 논 문제라 반복문 돌리면 시간초과뜸

 

내가 푼 방법은

1. a와 v 가 같으면 1 출력

2. v에 도착하기 위해 최소 v-a에는 올라가고 내려가며 도착해야 v에 한번의 추가적인 이동으로 도착할 수 있기 때문에

(v - a) // (a - b)를 구해서 카운트 세줌

cnt = 몫 >> 이동횟수임

3. 만약 카운트가 0이라면 v-a가 a-b보다 작다는 뜻 이때는 한번 올라간 이동을 수동으로 cnt+=1해줘야한다. 왜냐하면 이동횟수 한번이 고려되지 않았기 때문.

4. 혹시나 소수점 버리는 연산의 결과로 고려되지 않은 수가 있을때에도 수동으로 cnt+=1을 해준다.

ex) 16 2 33 의 경우

v - a = 17

a - b = 14 임.

최소 17까지 올라가야되는데 올라갔다 내려왔다의 연산으로는 14의 배수밖에 탐색하지 못 함.

17//14 = 1 인데 최소 17이상 올라가야 되기 때문에

1이 아니라 2번 올라가야됨. 그래서 +=1 해주는것

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import sys
 
input = sys.stdin.readline
 
a, b, v = map(int, input().split())
 
= v - a
cnt = v // (a - b)
if v == 0:
    cnt = 0
elif cnt == 0:
    cnt += 1
elif v > cnt * (a - b):
    cnt += 1
 
print(cnt + 1)
 
cs
728x90