Bakjoon Q2869 - C++

Q2869


Problem

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

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

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

Input

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

Output

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

예제 입력

1
5 1 6
1
100 99 1000000000

예제 출력

1
2
1
999999901

나의 제출

1
2
3
4
5
6
7
8
#include <bits/stdc++.h>
using namespace std;

int main(){
    int goal, speed, fail, now_h =0, day=1;
    scanf("%d %d %d",&speed, &fail, &goal);
    printf("%d", (int)ceil((double)(goal-speed)/(double)(speed - fail))+1);
}

참고 제출

1
2
3
4
5
6
#include<cstdio>
int main(){
	int speed,fail,goal;
	scanf("%d %d %d",&speed,&fail,&goal);
	printf("%d",(goal-fail-1)/(speed-fail)+1);
}

추가 내용

1. my sol

도달하는 날에는 fail하지 않으므로, goal에서 speed를 빼고 (도착하는 날) 남은 값을 speed-fail로 나눈다(도달 전 하루에 올라가는 길이). 예제입력 1의 경우를 보자. goal=6이면 도착하는 날 5만큼 올라가므로 1만큼만 speed-fail로 올라가면 된다. 즉, (goal - speed) / (speed - fail) 값을 올림한다. 1/4 이므로 올림하면 1. 도착하는 날 하루 더하면 값은 2이다. ceil 함수로 값을 반올림 해주었고, 나누기 연산 이전에 double로 임시 자료형 선언을 하지 않으면 계산 자체가 안되서 임시로 자료형을 부여했다.

2. reference sol

내 풀이를 쓰면 일단 올림을 구현하거나, if문을 이용해 나머지가 0이 아닌 경우 +1을 해야해서 풀이가 조금 길어진다. 다른 풀이가 좀 더 깔끔했다. 참고 제출한 풀이를 보자.

(goal-fail-1) / (speed - fail) + 1

이 한 줄에 풀이의 모든 것이 담겨있다. 나랑은 조금 사고 방식이 다르다. 도착하는 날에는 일단 fail하지 않는다. 따라서, goal에서 fail을 빼고 , 하루에 올라가는 양(speed - fail)으로 나누어주면 된다. 이때 분자에 1을 뺀 이유가 아주 훌륭하다. 만약 숫자가 나누어 떨어지는 경우, 그 자체가 그냥 답이다. 만약 나누어 떨어지지 않는 경우에는 int 정수형 특성상 몫만 저장하기 때문에 1을 더해주어야 한다. 이럼 또 if문을 사용해야겠지? 이를 방지하기 위해서 그냥 분자에다가 1을 빼버리고, 결과 값에다가 1을 더해줘버리는 것이다. 나누어 떨어져서 2가 나오던걸 분자에 1 빼버리면 int 저장값이 1이 되니까 1 더하면 어짜피 2다. 이런게 바로 지혜인듯.

총평

푸는 방법만 알면 아주 쉬운 문제. 자바로 풀지만 않으면 솔직히 뭘해도 맞긴 하는 문제인듯.