본문 바로가기

생각

오버플로우를 항상 조심해야한다.

라피신 문제를 풀다가 타임아웃을 만날 때가 가끔 있다.
왜?
이유는 간단하다. 존나게 많은 값을 비교하니 연산 시간이 걸려서다.

int 변수를 받아 1부터 제곱해주며 목표값까지 비교한다고 쳐보자.
idx = 0;
while (idx * idx < max)
과연 이 반복문은 예외처리 break 없이
모든 경우에서 반복문을 끝낼 수 있을까?
아니다.
만약 max가 int의 최대값일 때,
idx의 제곱이 int의 최대값을 넘기면,
오버플로우가 일어나 최소값이 되기에 값으로만 비교할 경우 빠져나갈 수 없다.
주의해야 한다.

그러면 해결방법은?
간단한 두가지 방법을 제시해보겠다.
1. 더 큰 자료형 변수를 받아 값을 비교해보기(int범위를 넘어서도 오버플로우가 일어나지 않음)
2. 반복문 내에서 예외처리를 통해 idx의 최대값에 제한주기

+. 양수만으로 비교한다면 idx * idx > 0을 반복 조건에 넣는 것도 추천한다.

'생각' 카테고리의 다른 글