정수 제곱근 판별

문제 링크

정수 제곱근 판별

분석

n의 제곱근을 구하고, 그 제곱근이 양의 정수로 된 n의 제곱근인지 확인하고, 그 제곱근에 +1을 한 후 제곱을 해주는 문제입니다.

제곱근을 구하는 방법은 cmathsqrt함수를 사용해서 구할 수 있습니다.
이때 정수로 딱 나눠지지 않는 경우 소수부를 포함해서 나옵니다.
문제는 정수로 된 n의 제곱근만 제곱해주므로 주의가 필요합니다.

풀이

#include <cmath>

long long solution(long long n) {
    long long answer;
    long long root = sqrt(n);
    
    if (root * root == n)
    {
        answer = pow(root + 1, 2);
    }
    else
    {
        answer = -1;
    }
    
    return answer;
}

root변수는 int일 경우 n의 제곱근을 모두 표현할 수 없으므로 long long을 사용합니다.

if (root * root == n)의 경우 sqrt(n)의 값이 양의 정수로 된 제곱근 값이 아닐 경우를 확인하는 코드입니다.
root자료형은 정수만 저장하는 자료형이므로 양의 정수로 된 제곱근 값이 아닐 경우 root를 제곱한다면 n의 값과 달라집니다.

pow함수는 거듭제곱을 해주는 함수입니다.
해당 코드의 경우 root + 1을 2제곱 해줍니다.
(root + 1) * (root + 1)처럼 해주는게 성능상 더 유리할 수 있습니다.

성능 요약

테스트 1 〉 통과 (0.01ms, 4.45MB)
테스트 2 〉 통과 (0.01ms, 4.21MB)
테스트 3 〉 통과 (0.01ms, 4.21MB)
테스트 4 〉 통과 (0.01ms, 4.02MB)
테스트 5 〉 통과 (0.01ms, 4.14MB)
테스트 6 〉 통과 (0.01ms, 4.21MB)
테스트 7 〉 통과 (0.01ms, 4.18MB)
테스트 8 〉 통과 (0.01ms, 4.2MB)
테스트 9 〉 통과 (0.01ms, 3.64MB)
테스트 10 〉 통과 (0.01ms, 4.14MB)
테스트 11 〉 통과 (0.01ms, 4.21MB)
테스트 12 〉 통과 (0.01ms, 4.15MB)
테스트 13 〉 통과 (0.01ms, 3.69MB)
테스트 14 〉 통과 (0.01ms, 3.68MB)
테스트 15 〉 통과 (0.01ms, 3.63MB)
테스트 16 〉 통과 (0.01ms, 4.17MB)
테스트 17 〉 통과 (0.01ms, 4.14MB)
테스트 18 〉 통과 (0.01ms, 4.21MB)

Programmers 카테고리 내 다른 글 보러가기

댓글남기기