문제는 백준 사이트와 똑같으니, 해설부터 보셔도 됩니다.
땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.
달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.
달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.
첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)
첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.
입력
2 1 5
출력
4
우선 공식을 생각해보면 처음에 떠오르는게 정상까지의 거리(v) / (오르는 거리(a) - 미끄러지는 거리(b))입니다. 근데 이 공식은 문제에서 제시한 조건(정상에 올라간 후에는 미끄러지지 않는다)에 부합하지 않기 때문에 v에서 b를 빼준 값에 a - b를 나눠줘야합니다.
day = (v - b) / (a - b)
간단하게 예시로 각각 a, b, v가 5, 1, 13으로 생각을 해봅시다. 원래의 답은 3일이 되는 날에 정상에 도착하는데, 처음 설명한 공식을 적용하면 하루가 추가됩니다. 그 이유는 처음 공식대로하면 마지막 날에도 b만큼 미끄러져서 정상에 도달하지 못하고, 12에 머물게 됩니다. 그리고 다음날로 넘어가버립니다. 그렇기 때문에 애초에 a에 b를 뺀 값만큼 계산을 하면 이런 문제가 해결이 됩니다.
또한, 정상을 정확하게 도착해야만 끝이 아니라, 정상을 넘어가도 끝납니다. 그래서 정상을 넘어가도 하루가 지나간 것이기 때문에 공식의 결과 값이 실수형일 경우(정상을 넘어갈 경우) 올림을 해줘야합니다. 하지만, int 타입의 변수를 사용하기 때문에 소수점이 날아가서 하루가 적게 계산이 됩니다. 그렇기 때문에 (v - b) % (a - b)가 0이 아닐 경우에 day에 하루를 추가해줍니다.
- 처음 생각해볼 수 있는 공식 v / (a - b)
- 하지만, 이 규칙은 정상에 도달해도 미끄러지는 공식이기 때문에 (v - b) / (a - b)를 사용
- 공식의 결과 값이 실수형이 나올 경우(정상을 넘어갈 경우) 올림을 해야함.
- 하지만, int 변수를 쓸 것이기 때문에 소수점이 날아가서 하루 적게 계산이 됨.
- 따라서, (v - b) % (a - b)가 0이 아닐 경우에 day++
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int v = sc.nextInt();
int day = (v - b) / (a - b);
if ((v - b) % (a - b) != 0) {
day++;
}
System.out.println(day);
/* Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int v = sc.nextInt();
int day = (v - a) / (a - b) + 1;
if ((v - a) % (a - b) != 0) {
day++;
}
System.out.println(day);
*/
/* Scanner sc = new Scanner(System.in);
double a = sc.nextInt();
double b = sc.nextInt();
double v = sc.nextInt();
System.out.println((int)Math.ceil((v - a) / (a - b)) + 1);
*/
}
}
밑에 주석은 다른 풀이 방법들입니다. 생략하셔도 좋습니다. 간략하게 두 풀이를 설명드리자면,
마지막에 이동하는 거리(정상에 도착하여 미끄러지지 않는 거리)는 a와 같습니다. 그렇기 때문에 v - a를 하여, 마지막에 하루를 더해주면 정상에서 미끄러지면 안되는 조건이 해결됩니다. 이후는 원래 풀이와 같습니다.
1번 풀이에서 if문 대신 공식의 결과값을 올림 하여 출력하는 방법.
이 코드에서 하루는 a - b입니다. 그렇기에 v - a + a - b하면 v - b가 되어서 결론은 원래 풀이와 똑같습니다. 접근만 다른 방식으로 한 것입니다.