프로그래머스(Level1) - 정수 제곱근 판별
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다. n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다.
3은 양의 정수의 제곱이 아니므로, -1을 리턴합니다.
루트 n을 한것이 정수라면 어떤 양의 정수 x의 제곱이라는 것을 알 수 있다. 그러니 for문을 돌려서 x를 찾아 x+1 제곱을 answer에 넣어주면 된다.
#include <string>
#include <cmath>
#include <iostream>
using namespace std;
bool is_integer(float k){
return floor(k) == k;
}
long long solution(long long n) {
long long answer = 0;
if(is_integer(sqrt(n))){
for(int i=1; i <= n ; i++){
if(pow(i,2) == n){
answer = pow(i+1,2);
break;
}
}
}else{
answer = -1;
}
return answer;
}
처음에는 위와 같은 풀이로 풀었다. 하지만 위의 풀이를 두줄로 줄일 수 있다는 것을 알게되었다. 루트 n을 다시 제곱했을 때, n과 같다면 n이 어떤 양의 정수 x의 제곱이라는 것을 알 수 있다. 루트 n(sqrt(n))은 양의 정수 x이므로 루트n+1의 제곱을 return해주면 된다.
#include <string>
#include <vector>
#include <math.h>
using namespace std;
long long solution(long long n) {
long long rootN = sqrt(n);
return powl(rootN, 2) == n ? powl(rootN + 1, 2) : -1;
}
double pow( double x, double y );
float powf( float x, float y );
long double powl( long double x, long double y );