class Solution { public long solution(int price, int money, int count) { long answer = -1; long total=0; for(int i=1;i<=count;i++){ total+=(price*i); } answer=total-money; if (answer<0){ answer=0; } return answer; } } 이 문제에서 total 을 INT로 선언하니까 틀리는데 그 이유가 뭐야? 참고로 놀이기구의 이용료 price : 1 ≤ price ≤ 2,500, price는 자연수 처음 가지고 있던 금액 money : 1 ≤ money ≤ 1,000,000,000, money는 자연수 놀이기구의 이용 횟수 count : 1 ≤ count ≤ 2,500, count는 자연수
total 변수를 int로 선언했을 때 문제가 발생하는 이유는 정수형의 범위를 초과할 가능성 때문입니다.
Java에서 int 타입은 -2,147,483,648 ~ 2,147,483,647의 범위를 갖습니다. 하지만 문제 조건에 따라 price, money, count의 조합에 의해 total 값이 이 범위를 초과할 수 있습니다.
문제 상황 분석
total은 price와 count를 이용하여 계산됩니다:
total=price×(1+2+3+⋯+count)\text{total} = price \times (1 + 2 + 3 + \dots + count)이 합은 등차수열의 합 공식을 사용하면:
total=price×count×(count+1)2\text{total} = price \times \frac{\text{count} \times (\text{count} + 1)}{2}최악의 경우
- price = 2500, count = 2500일 때: count×(count+1)=2500×2501=6,252,500\text{count} \times (\text{count} + 1) = 2500 \times 2501 = 6,252,500 이 값을 price와 곱하면: total=2500×6,252,500=15,631,250,000\text{total} = 2500 \times 6,252,500 = 15,631,250,000
위 결과는 15,631,250,000으로, int의 최대값인 2,147,483,647를 훨씬 초과합니다. 따라서 int 타입으로는 이 값을 저장할 수 없고, **오버플로우(overflow)**가 발생하여 잘못된 값이 나오게 됩니다.
해결 방법
total을 long 타입으로 선언하면, long은 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807의 범위를 가지므로 위 계산에서도 안전합니다.
요약
- int 타입의 범위는 2,147,483,647까지이므로, 계산 중에 이 범위를 초과하면 오버플로우가 발생합니다.
- 문제 조건에 따라 total은 long 타입을 사용해야 안전합니다.