enyawg   2년 전

어느부분에서 문제가 되는지 모르겠습니다

wizardrabbit   2년 전

안녕하세요? 반례 드립니다:

입력: 2100000000 10000000 10000001
정답: 2100000001
출력: 5

위의 반례를 입력했을 때 코드의 27번째 줄 A = A + B 에서 A 값은 아래와 같이 변합니다:

2110000000
2120000000
2130000000
2140000000
-2144967296

잘 더해지다가 갑자기 -2144967296이라는 엉뚱한 값이 나왔습니다. A 값이 예상치 못하게 갑자기 음수가 되었고, 그 시점에서 A >= C * i가 만족하지 않아 반복문을 빠져나오게 되어 답이 5가 출력되게 됩니다. 왜 이런 현상이 발생했을까요?

변수 A의 자료형은 int이고, int의 경우 -2,147,483,648 ~ 2,147,483,647 범위의 수를 저장할 수 있습니다. 이 범위를 초과하면 오버플로우(overflow) 가 발생할 수 있습니다. 오버플로우는 지정된 계산 범위를 초과했을 때 발생하는 오류로써, 값을 다시 최솟값부터 세거나, 초과한 부분의 데이터가 0으로 생략되는 등 언어마다 오버플로우가 발생했을 때의 현상은 제각각입니다. 어쨌든 중요한 것은 오버플로우가 발생하면 의도와 다른 결과를 낼 수 있다는 것입니다.

올려주신 코드에는 A에 B를 계속 더하는 연산이 반복되므로 A와 B 값이 너무 클 경우 덧셈을 수행하면서 이 범위를 넘길 수 있게 됩니다. 따라서 이 방법은 위험한 방법일 수 있습니다. 오버플로우가 발생하지 않으면서 문제를 해결할 수 있는 방법이 분명 있을 것입니다.

힌트를 드리자면, A에 값을 더하는 대신 매 생산마다 생기는 이익을 A에서 빼는 방식 또한 사용할 수 있습니다.

문제가 해결되기를 바랍니다!

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