문제 링크 : https://leetcode.com/problems/first-bad-version/
기본적인 바이너리 서치 문제이나
오버플로우를 주의해야한다...
기본적으로 풀이는,
1. 검색 범위의 맨 앞(min 또는 left) 맨뒤(max 또는 right) 인덱스를 저장하는 변수를 설정하고
각각 1과 n으로 초기화 한다.
min은 항상 Not bad version, max 는 항상 bad version 이라고 가정하고 풀었기 때문에
양 끝값 확인하는 절차로 버전1이 배드버전인지 확인하는 코드를 추가로 넣었다.
2. 그 가운데인덱스를 API호출로 확인 후
가운데가 Bad version 이면 max 인덱스를 mid로 옮기고, Bad version 이 아닌 경우 min을 mid로 옮긴다.
여기서 중요한것은 중간값을 구할 때
mid = (min + max) / 2 로 구하면 overflow 가 일어날 수 있으므로
mid = min + (max - min)/2 라고 써줘야한다는 것이다.
두 수식은 사람눈에는 비슷하지만 컴퓨터가 볼 때는... 두 수의 합이 자료형 사이즈를 넘어버리면 완전히 다른 식이 된다.
3. 이렇게 반복하다가 min 과 max 가 만나면
첫번째 Bad version 은 max 이므로 max를 리턴해주면 된다.
아래는 내 해답
/* The isBadVersion API is defined in the parent class VersionControl.
def isBadVersion(version: Int): Boolean = {} */
class Solution: VersionControl() {
override fun firstBadVersion(n: Int) : Int {
var min = 1
var max = n
var mid : Int
if(isBadVersion(min)) return 1
while(min+1 < max) {
mid = min + (max-min)/ 2
if(isBadVersion(mid))
{
max = mid
} else {
min = mid
}
}
return max
}
}
isBadVersion API 가 구현이 안 된 상태로 코딩을하려니 디버깅이 어려워서 힘들었다....
오래걸릴줄 알았으면 isBadVersion 구현해서 IDE 디버거를 썼을텐데
흠 개쉽군 하고 그냥 릿코드 사이트에서 풀다가 1시간은 족히걸렸다.... 힝힝
프로그래밍 첫 강의에서 배운 자료형의 사이즈..... 역시 기본이 중요한 것이다....
'프로그래밍 공부 > 공부일지' 카테고리의 다른 글
[python,flask] 220217 Flaks 공부 (0) | 2022.02.17 |
---|---|
[Python,Flask] 210103 Flask 공부 (0) | 2022.01.04 |
[GIT/GITHUB] 깃허브로 공부한 내용 백업하기 / 깃허브 왕초보 / 깃허브 처음 / 깃허브 기초 (1) | 2021.12.06 |
211005 android studio 레이아웃 연습... (0) | 2021.10.05 |
Error: The cppbuild task detection didn't contribute a task for the following configuration 에러 해결 (0) | 2021.09.29 |