[2869] 백준 : 달팽이는 올라가고 싶다(C)

지환·2022년 5월 11일
0

백준(C)

목록 보기
29/47
post-thumbnail

출처 | https://www.acmicpc.net/problem/2869

문제

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

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

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

입력

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

출력

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

아이디어

🤢달팽이가 낮에는 A만큼 오르고, 밤에는 B만큼 미끄러지기 때문에 하루동안 A-B만큼 오른다

🤢조건에 의해 A>B≥1이기에, 언제가는 반드시 정상에 오를 수 있다.

🤢 만약 달팽이가 n일을 오른다고 하면, 마지막 n번째 날에는 미끄러지는 것을 생각하지 않아도 된다.

🤢 따라서, (A-B)×(n-1)+A≥V의 수식을 만족하는 n의 최솟값을 구하면 충분하다.

🤢이때 마지막 날에는 1만큼 올라도, A만큼 올라도, 정상에 도달만 하면 되기 때문에 '≥'으로 이를 표현해준다. (A-B)×(n-1)+A≥V 라는 식은 n≥(V-A)/(A-B)+1 로 바꿀 수 있다.

🤢A, B, V 모두 int형이므로, (V-A)/(A-B)의 결과값 역시 int형이다. 이 값이 본래 정수라면 이는 문제될 것이 없고, n의 최솟값은 (V-A)/(A-B)+1이 된다.

🤢하지만 이 값이 본래 소수라면, 정수 부분만 저장이 되기 때문에 소수 부분만큼 모자르게 된다. 또한 '며칠'을 의미하는 n의 값은 항상 정수가 되어야 한다. 따라서 이 경우, n의 최솟값은 (V-A)/(A-B)+2가 된다.

코드

int main()
{
	// A만큼 상승하고 B만큼 미끄러진다. (A-B) 하루만큼 상승한 수식, V는 높이(최대) 
	// (A-B) * (N-1) + A >= V
	// 딱 나누어 떨어지는 조건은 아래와 같고, 소수점이 나온다면 뒤에 +2가 맞다.
	// N >= V-A / A-B + 1
	// 소수 처리하기 위해 >= V-A / A-B + 2로 설정
	int a, b, v, n;
	scanf_s("%d %d %d", &a, &b, &v);
	if ((v - a) % (a - b) == 0)
	{
		n = (v - a) / (a - b) + 1;
	}
	else
	{
		n = (v - a) / (a - b) + 2;
	}
	
	printf("%d", n);

}
  
  
profile
아는만큼보인다.

0개의 댓글