Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 지독한 컨셉충
- 다음에 또 만나자
- 모바일 청첩장
- 수제비 2022
- CRUDS
- 아싸의 생일
- 2022 정보처리기사
- 재택치료
- 교육봉사
- 개강해짐
- FLUTTER
- 얘들아 잘 지내니
- 자가격리
- 생일축하해 나 자신
- pem키 분실
- N-Queen
- 대학생
- 다들 안잊어서
- 수제비2022 정리
- 스프링 MVC
- AWS
- 정보처리기사 2022
- 정보처리기사2022
- 다행이야...ㅎ
- 교수님 과제 이제 그만..
- 확진
- 뽀모도로 타이머
- 플러터
- 레이튼 교수와 이상한 마을
- 대외활동
Archives
- Today
- Total
Rei’s Tech diary
오버플로우 방지 중간값 계산 (overflow-safe midpoint calculation) 본문
프로그래밍/TroubleShooting
오버플로우 방지 중간값 계산 (overflow-safe midpoint calculation)
Reiger 2025. 1. 14. 14:14
📌 이전 방식 : (left + right) / 2
보통 중간값을 계산할때 다음과 같은 수식을 사용한다.
이때 left와 right값이 매우 큰 경우, 두 값을 더하는 과정에서 정수 오버플로우가 발생할 수 있다.
int mid = (left + right) / 2;
int left = Integer.MAX_VALUE - 2;
int right = Integer.MAX_VALUE;
int mid = (left + right) / 2;
System.out.println(mid); //-2 : 오버플로우로 인해 잘못된 값 반환
📌 개선 방식 : left + (right - left) / 2
따라서 다음과 같이 개선한다.
1. (left - right)는 항상 right와 left의 차이이므로 오버플로우가 발생하지 않는다.
2. (right - left) / 2는 탐색 범위의 절반만큼 더하거나 빼는 값을 계산한다.
3. left + (right - left) / 2는 left로부터 탐색 범위의 절반만큼 이동한 값을 의미한다.
int mid = left + (right - left) / 2;
int left = Integer.MAX_VALUE - 2;
int right = Integer.MAX_VALUE;
int mid = left + (right - left) / 2;
System.out.println(mid); //2147483646
💡 수식
✅ 정리
int 자료형 범위 : −2,147,483,648 ~ 2,147,483,647
대략 자료형 범위를 넘어가는 억단위 대규모 데이터를 처리할때는 유용할 것 같다.
'프로그래밍 > TroubleShooting' 카테고리의 다른 글
[Flutter] 회전 메타데이터 문제 해결 - Android에서 동영상이 이상하게 회전돼서 나올 때 (feat. FFmpeg) (0) | 2025.05.12 |
---|---|
[Flutter] 플러그인 NDK 버전 불일치 문제 해결 (9) | 2025.04.05 |
[Spring Boot] JWT Cannot pass null or empty values to constructor 문제 해결하기 (0) | 2024.04.22 |
[Spring Boot] JWT 403 Forbidden 오류 해결하기 (0) | 2024.04.22 |
[AWS] pem키 분실 문제 해결하기 (0) | 2024.01.02 |