POST

백준 2869 달팽이는 올라가고 싶다 [C언어] - 어려웠음

진짜 이 문제는

https://www.acmicpc.net/board/view/53443

 

글 읽기 - (V-B)/(A-B)의 올림 = (V-B-1)/(A-B) +1 ????

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

여기를 참고하고 풀어야만 했다.

if문으로 나누어 떨어지지 않는 값을 예외처리하면 이렇게 고민하지 않아도 됐을 문제였지만

다른 사람이 (V - B - 1) / (A - B) +1로 처리하는 방식을 보고 이해가 안되어 한참동안 고민했다.

 

dldyddlwl  님의 글을 가져왔다.

자 우선, 간단하게 V-B를 x,  A-B를 y라고 둡시다.

 

그러면, 두 가지의 경우가 있겠죠?

 

1) 나누어 떨어지는 경우

x/y = d ( d는 임의의 정수 ), 이 때, (x-1)/y는 반드시 이 d보다 작은 값입니다. 그런데 int형은 소수점을 잘라내므로, x-1/y = d-1이 나오고, 거기다 + 1을 하면 원래 d가 나옵니다.

2) 나누어 떨어지지 않는 경우

x/y = d + f ( d는 임의의 정수, f는 0<f<1을 만족하는 실수 ), 이 때 y를 양변에 곱해주면, x = y(d+f) 입니다. 여기서 양변에 1을 빼주면, x-1 = y(d+f)-1 입니다. 다시 y로 나눠준다면,


x-1/y = (d+f) - 1/y 가 됩니다. 그런데 int형이니까 1/y는 반드시 잘리겠죠? ( 1/y (y>=2를 만족하는 y)는 반드시 1보다 작다, y가 반드시 1보다 크다는 조건은, 나누어떨어지지 않는다는

조건에서 기인합니다, 만약 y가 1이라면, 모든 수가 나누어떨어질테니깐요. )

그러므로 x-1/y = d+f - 1/y = d+f 그리고, 여기에 +1을 더해서 x-1/y + 1은 애초에 우리가 의도한, 나누어떨어지지않는 경우 + 1 과 같은 결과가 됩니다.

아마 궁금하셨던건 굳이 왜 이런 식을 썼냐는 것 일 것입니다. 아마 그 식을 쓰신 분의 의도는 정말로 나누어떨어지는 조건을 쓰기 귀찮으셔서 나누어 떨어지는 경우와 그렇지 않은 경우를

한번에 만족하는 식으로 쓰신것 같습니다.

#include <stdio.h>

int main()
{
	int a, b, v, day=0;
	scanf("%d %d %d", &a, &b, &v);
	
	day = (v - b - 1) / (a - b) + 1;
	printf("%d", day);

	return 0;
}