본문 바로가기

Programming/ACMICPC

ACMICPC 2869 달팽이는 올라가고 싶다


문제

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

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

또, 정상에 올라간 후에는 미끄러지지 않는다.

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

입력

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

출력

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


간단한 문제인데 3번이나 틀려버렸다.

첫번째 틀린 코드는 이랬다.

시간 초과 났다.

방식이 좀 무식하긴 해도 왜지..? 하다가 보니 입력값의 한계값이 10^9이다.

2 1 1,000,000,000 같은 입력 들어오면 십억번 연산해줘야하는 코드였다.


조금 머리를 써보자 해서 나온 코드가 이거

달팽이의 낮의  위치 h 는 A + (d-1)*(A-B) 로 나타낼 수 있다. (d = 현재 날짜)

 h >= V 가 되는 때의 d를 구해보자면

V <= A+ (d-1)*(A-B)

d >= (V-A)/(A-B) + 1


수식은 맞았는데 코드가 틀린 이유는 간단했다.

(V-A)/(A-B)가 int로 형변환하는 과정에서 소수점이 다 버려진다.

하지만 걸리는 날짜를 구해야하기 때문에 소수점을 '버림'이 아닌 '올림'을 해야 하는게 맞다.

if ((V-A)%(A-B)):

day += 1

그래서 이 if문을 추가해줌으로서 소수점아래가 0이 아닐시 날짜에 +1 하게 만들어주니 해결!



'Programming > ACMICPC' 카테고리의 다른 글

ACMICPC 1105 팔  (0) 2015.10.03
ACMICPC 9575 운 좋은 수  (0) 2015.10.03
ACMICPC 3029 경고  (0) 2015.10.02
ACMICPC 3028 창영마을  (0) 2015.10.02
ACMICPC 2884 알람 시계  (0) 2015.10.01