문제
땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.
달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.
달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)
출력
첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.
전체 코드(Java)
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String [] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
double A = Integer.parseInt(st.nextToken());
double B = Integer.parseInt(st.nextToken());
double C = Integer.parseInt(st.nextToken());
int ans = (int)Math.ceil((C - A) / (A - B)) + 1;
bw.write(String.valueOf(ans));
bw.flush();
bw.close();
br.close();
}
}
풀이
- 달팽이가 나무 막대를 모두 올라가는 시간을 공식화 하였다.
- while 문으로 구할 수도 있지만, 시간이 많이 소요될 것으로 예상
- 달팽이는 아침에 A만큼 올라가고 밤에는 B만큼 내려가므로 올라갈 거리인 C를 A-B로 나누면 된다는 생각을 할 수 있다
- 하지만, 저것만으로는 항상 하루 단위로 생각한 것이다. 실제로는 아침에 올라가기 때문에 목표 거리에 도달하면 밤에 다시 내려가는 것을 계산하지 않아야 한다
- 예를 들어 하루에 2 만큼 올라가고 1 만큼 내려가는데 목표 거리가 2라면 1일 아침에 도착한다. 그러나 C / (A-B)라는 공식으로는 2라는 답이 나오므로 틀린 답이다.
- 이를 막기 위해 반올림 메소드인 ceil을 이용했다.
- (int)Math.ceil((C - A) / (A - B)) + 1 공식에 의하면 아침에 도달하는 경우를 포함해 정확히 계산이 가능하다
'Problem Solve' 카테고리의 다른 글
[백준 / BOJ] 2839번 : 설탕 배달 (풀이 / 해설 / Java) (0) | 2021.04.02 |
---|---|
[백준 / BOJ] 2775번 : 부녀회장이 될테야 (풀이 / 해설 / Java) (0) | 2021.03.30 |
[백준 / BOJ] 1193번 : 분수찾기 (Java) (0) | 2021.03.24 |
[백준 / BOJ] 2292번 : 벌집 (Java) (0) | 2021.03.23 |
[백준 / BOJ] 1712번 : 손익분기점 (Java) (0) | 2021.03.22 |