☁ sqrt() 함수를 사용한 간단한 풀이와 내장함수를 사용하지 않고 이진 탐색(Binary Search)을 이용한 풀이가 있다.
문제
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
입출력 예시
풀이 #1 | sqrt() 함수 이용
#include <math.h>
using namespace std;
long long solution(long long n) {
long long answer = 0;
answer = sqrt(n) - int(sqrt(n)) == 0? pow(sqrt(n)+1, 2) : -1;
return answer;
}
풀이 #2 | 내장함수 x, 이진 탐색 이용
using namespace std;
long long solution(long long n) {
long long left = 1, right = n;
while (left <= right) {
long long mid = left + (right - left) / 2;
if (mid <= n / mid) {
if (mid * mid == n) {
return (mid + 1) * (mid + 1); // 제곱근 찾음
}
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1; // 제곱근 못찾음
}
💣 내장함수의 메커니즘을 구현해 보겠다는 오기로 시작한 두 번째 풀이..
이진 탐색을 이용하여 중간 값부터 탐색하여 현재의 중간값이 찾고자 하는 제곱근인지, 더 큰지, 더 작은지를 판단하며 찾아가는 방식으로 풀었다.
🧨 오버 플로우 방지!
long long 범위를 벗어나는 mid * mid가 나오는 것을 예방하여, 9번째 줄에서 한 번 체크하고 넘어가도록 작성했다.
설마설마했는데 넘어가는 경우가 존재했다..
'🐸 Problem Solving > Programmers' 카테고리의 다른 글
[Programmers/C++] 코드 처리하기 (0) | 2024.07.19 |
---|---|
[Programmers/C++] [PCCP 기출문제] 1번 / 붕대 감기 (0) | 2024.06.24 |
[Programmers/C++] [PCCE 기출문제] 10번 / 데이터 분석 (0) | 2024.06.14 |