임의의 양의 정수 $n$에 대해, $n$이 어떤 양의 정수 $x$의 제곱인지 아닌지 판단하려 한다.
$n$이 양의 정수 $x$의 제곱이라면 $x+1$의 제곱을 리턴하고, $n$이 양의 정수 $x$의 제곱이 아니라면 -1을 리턴하는 함수를 완성하라.
내가 풀어나간 방법
1. 제곱근 구하기
먼저 제곱근을 구하고 그걸 정수 형태로 만들어야 한다.
sqrt()
는 정수형만 반환하는 것이 아니기 때문에 round()
를 통해 반올림해서 정수 형태로 만든다.
double sqrtResult = std::sqrt(n);
long long intSqrtResult = static_cast<long long>(std::round(sqrtResult));
2. 조건에 맞는지 검증
여기서 intSqrtResult
를 제곱하여 입력받은 수 n
이 나오면,
그 수에 1을 더하고 그 수를 제곱한 값을 리턴한다.
만약 아니라면 -1을 리턴하게 된다.
if (intSqrtResult * intSqrtResult == n) {
long long nextInt = intSqrtResult + 1;
return nextInt * nextInt;
} else {
return -1;
}
더 심플한 방법
다른 사람이 제출한 답을 보고 있는데 더 심플한 방법이 있더라.
long long solution(long long n) {
if (sqrt(n) == floor(sqrt(n)))
return pow(sqrt(n)+1,2);
else
return -1;
}
동작 자체는 나의 방법과 동일하다고 볼 수 있다.
floor와 round의 차이가 있긴 하지만 그렇게 다르다곤 볼 순 없지.
짧아지니 보기도 좋아졌다.
다른 사람이 어떻게 했는지 보는 것도 좋은 공부가 되는 것은 확실하다.
'Camp > T.I.L.' 카테고리의 다른 글
[TIL #15] 콜라츠 추측 (0) | 2024.07.09 |
---|---|
[TIL #14] 정수 내림차순으로 배치하기 (0) | 2024.07.04 |
[TIL #12] 무조건적 서브쿼리를 지양하고 싶다 (0) | 2024.07.02 |
[TIL #11] 나머지가 1이 되는 수 찾기 (0) | 2024.07.01 |
[TIL #10] 자릿수 더하기 / 약수의 합 (0) | 2024.06.28 |