[프로그래머스/C++] ㅡ LV1 - 정수 제곱근 판별

2021. 4. 3. 23:32필요/코딩테스트(프로그래머스)

문제

programmers.co.kr/learn/courses/30/lessons/12934

 

코딩테스트 연습 - 정수 제곱근 판별

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

programmers.co.kr

풀이

#include <cmath>

using namespace std;

long long solution(long long n) {
    long long answer = 0;
    long long a = sqrt(n);
    if (a*a == n) {	// 양의 정수x의 제곱인 경우
        answer=pow(a+1,2);
    }
    else {	// 아닌 경우
        answer=-1;
    }
    return answer;
}

개념

cmath 라이브러리를 사용한다.

제곱을 구하는 함수는 pow(밑, 지수) 이고, 제곱근을 구하는 함수는 sqrt(값) 이다.


풀이

양의 정수 x의 제곱인지 판별해야한다.

n의 제곱근이 자연수일 경우를 찾으면 된다.

long long 자료형을 사용하므로 n의 제곱근이 자연수가 아닌 경우, 값은 정수형으로 바뀌어 저장된다.

이 과정에서 값이 손상되므로 그 값을 다시 제곱하면 원래의 n이 되지 못한다.

따라서 이를 조건문으로 사용해서 문제를 해결했다.


+a

일단 최대한 라이브러리를 사용하지 않으려고 했다.

n은 long long 자료형을 사용하고 범위가 매우 큰 값까지 존재한다.

양의 정수 x의 제곱인지 확인하기 위해 반복문을 사용하는 것은 시간초과가 나올 것으로 예상된다.

따라서 cmath 라이브러리를 사용하기로 결정했다.

 

첫 시도에서 몇몇 테스트를 통과하지 못했는데, 이때는 다른 판별 기준을 사용했다.

이때 n/sqrt(n) == sqrt(n) 가 n의 제곱근이 자연수임을 구별해줄 것이라고 생각했다.

이는 n의 제곱근이 자연수일 때의 모든 조건을 만족하지만, 아닌 경우도 종종 만족한다. (더 큰 범위이다)

그 예시는 n=5일 때이다.