문제
정수가 주어지면, 그 수의 정수 제곱근을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정수 n이 주어진다. (0 ≤ n < 2^63)
출력
첫째 줄에 q2 ≥ n인 가장 작은 음이 아닌 정수 q를 출력한다.
시나리오
처음엔 math라이브러리의 sqrt()함수를 호출한 것을 반올림해서 출력했지만 오답이 나왔다.
그럴만도 한게 일괄적으로 반올림한다면 반올림 하지 않아야 정답인 케이스도 있을 수 있기 때문에 틀린 아이디어라고 할 수 있다.
그렇다면 탐색으로 접근해보자. 주어진 정수n의 크기는 2의 63제곱 즉, 900경 이상의 수가 나온다. 이를 완전탐색으로 일일이 돌면 당연히 풀 수가 없다.
하지만 log(2^63)은 43정도 밖에 되지 않으므로 이분탐색으로는 제한시간 내에 충분히 탐색가능한 수준이다.
따라서 1부터 n까지 어떤 수 m의 제곱이 n이 되는 m을 이분탐색으로 찾으면 되겠다.
코드
n = int(input())
lt = 1
rt = n
res = 0
while lt <= rt:
mid = (lt + rt) // 2
if mid * mid >= n:
res = mid
rt = mid - 1
else:
lt = mid + 1
print(res)
'Algorithm > 이분탐색' 카테고리의 다른 글
| 백준 2805-나무자르기 (파이썬) (0) | 2022.09.10 |
|---|---|
| 이분탐색(파라메트릭 서치)문제 푸는 요령 (0) | 2022.09.07 |
| 섹션 4. 이분 탐색(결정알고리즘) - 마구간 정하기 (0) | 2022.09.06 |