[Leetcode] 69. Sqrt(x)

Algorithm|2021. 8. 3. 16:04
반응형

Identifying the Problem

주어진 x의 제곱근을 구한다.

단, 소수점 이후는 잘라 나타내고, pow 함수는 사용하면 안 된다.

 

Constraints:

  • 0 <= x <= 2^31 - 1

 

Input: x = 8

Output: 2

Explanation: The square root of 8 is 2.82842..., and since the decimal part is truncated, 2 is returned.

Organizing thoughts

직관적인 아이디어로 반복문을 사용해 i² == x 거나 i² 이 x를 초과하는 순간을 잡아내면 끝이긴 한데,

 x가 2^31 - 1 인 경우 엄청난 반복을 해야 하고, i를 제곱하는 과정에서 int의 허용범위를 벗어나는 경우가 생겼다.

 

따라서 다른 조건이나 패턴을 찾아보았다.

x를 절반으로 나눈 값은 x의 제곱근이 될 수 없다. 

라는 패턴을 찾을 수 있었다.

 

따라서 중앙값 기준으로 양끝을 조이면 된다.

 

1. 양 끝 기준으로 중앙값 mid을 정하고

2. mid² == x 인 경우 mid 리턴

3. mid² > x 인 경우 끝을 mid - 1로 줄인다.

4. mid² < x 인 경우 처음을 mid +1로 늘린다.

 

단 mid² 와 x를 비교하는 것은 int 범위를 벗어나므로 mid 와 x/mid를 비교한다.  

Sourcecode

int mySqrt(int x)
{



	if(x<2) {return x;}

	int first=1;
    	int end=x;
    	int mid=0;

	while(first<=end) //처음과 끝을 조이는 방식이기에 first가 증가되고 end 가 감소하다보면 
    				  //언젠간 만난다.
	{
        mid=first+(end-first)/2;
        		
		if(mid==x/mid)
			return mid;
        		
		if(mid<x/mid)
	        first=mid+1; //제곱값이 x에 도달하도록 처음값을 증가시킨다.
        		
      	  	else
	        end=mid-1; Q: 왜 과감하게 mid - 1 을 하는가? 
                        	A: 어차피 mid 보다 큰 값은 제곱근이 안된다.
        	
  	}
    	
        return end;
    
    
}

 

 

반응형

'Algorithm' 카테고리의 다른 글

[Leetcode] 100. Same Tree  (0) 2021.08.03
[Leetcode] 94. Binary Tree Inorder Traversal  (0) 2021.08.03
[Leetcode] 238. Product of Array Except Self  (0) 2021.08.01
[Leetcode] 202. Happy Number  (0) 2021.08.01
[Leetcode] 338. Counting Bits  (0) 2021.07.30

댓글()