728x90

문제 링크 : https://leetcode.com/problems/first-bad-version/

 

First Bad Version - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

 

기본적인 바이너리 서치 문제이나

오버플로우를 주의해야한다...

 

기본적으로 풀이는,

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시간은 족히걸렸다.... 힝힝

 

프로그래밍 첫 강의에서 배운 자료형의 사이즈..... 역시 기본이 중요한 것이다....

728x90

+ Recent posts