onjo0127   8년 전

초등부 용액 문제에 for문하나 더 씌워서 해 봤는데

40%대에서 틀리네요


정렬해놓고 절대값이 작아지는 쪽을 좁히며 최소값을 구하는 방식입니다.

koosaga   8년 전

f(arr[left] + arr[right] + arr[i])


여기서 int + int + int 라서 오버플로우가 나겠네요.

이게 문제인지는 잘 모르겠다만..

onjo0127   8년 전

그래서 함수도 long long형으로 만들었는데요...

indioindio   8년 전

인자가 long long이어도 int의 덧셈이 먼저 된 후에 long long으로 타입변환이 돼서 오버플로우는 여전히 일어날 것 같습니다.

onjo0127   8년 전

아하...

좋은 정보 감사합니다!

onjo0127   8년 전

질문 하나만 더 드릴게요...


이렇게 해도 틀리는데

형변환 이렇게 하는 거 맞나요?

onjo0127   8년 전

아...

두 번째 괄호 없애니까 맞네요

모두 감사드립니다!

indioindio   8년 전

음 이렇게 하시는 건 사실 아까와 별반 차이가 없을 것 같습니다.

이 경우에도 여전히 arr[left] + arr[right-1] + arr[i] 의 덧셈이 완료된 후에 long long으로 변환되기 때문입니다.

arr를 long long형으로 선언하시거나, (long long) arr[left] + arr[right-1] + arr[i]로 덧셈하기 전에 셋 중 하나의 타입을 바꿔주시면

계산을 할 때 정보의 손실이 없는 쪽으로 형변환을 하기 때문에 오버플로우가 없는 결과를 얻을 수 있을 것 같네요.

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