진짜 이 문제는
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;
}
'온라인 저지 > 백준 일반' 카테고리의 다른 글
백준 2775번 부녀회장이 될테야 [C언어] (0) | 2022.03.09 |
---|---|
백준 10250 ACM 호텔 [C언어] (0) | 2022.03.07 |
백준 1193번 분수찾기 [C언어] (0) | 2022.03.06 |
백준 2292 벌집 [C언어] (0) | 2022.03.06 |
백준 1712번 손익 분기점 [C언어] (0) | 2022.03.06 |