[프로그래머스] Level1 - 정수 제곱근 판별

ERror.ASER·2020년 7월 27일
0

프로그래머스

목록 보기
34/54
post-thumbnail

프로그래머스(Level1) - 정수 제곱근 판별


문제 설명

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다. n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.

제한사항

  • n은 1이상, 50000000000000 이하인 양의 정수입니다.

입출력 예

입출력 예 #1

121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다.

입출력 예 #2

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 );

profile
지우의 블로그

0개의 댓글