sjnov11   5년 전

안녕하세요, 6549 문제를 푸는데 계속 오답이 나다가 

4번째 줄에 arr[idx]와 right-left+1 에 long long으로 캐스팅을 해주니 통과가 되더군요.

그 이유가 무엇인지 혹시 알 수 있을까요?

감사합니다.

jh05013   5년 전

저게 없으면 int 두 개를 곱한 순간에 이미 오버플로우가 나기 때문에, 그 결과를 result에 넣어봤자 의미 없는 수로 남습니다.

bupjae   5년 전

result = arr[idx] * (right - left + 1); 라고만 쓰면 곱셈 연산을 int 연산으로 한 뒤 값을 long long 으로 바꿔서 result 에 저장합니다.

이 경우 int overflow 가 발생하면 overflow 때문에 잘못 계산된 값이 그대로 long long으로 바뀌어서 result 에 기록됩니다.

반면 result = (long long)arr[idx] * (long long)(right - left + 1); 라고 쓰면 먼저 long long 으로 바꾼 뒤에 곱셈을 합니다.

int 범위를 넘어서도 overflow 가 발생하지 않고, 문제에서 주어진 조건에 따르면 long long 의 범위를 넘어서는 데이터는 주어질 수 없으므로

항상 올바른 계산 결과가 result 에 기록됩니다.

sjnov11   5년 전

감사합니다! 

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