문제 설명
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
제한 조건
n은 1이상, 50000000000000 이하인 양의 정수입니다.
입/출력 예
n = 121 / return 144
n = 3 / return -1
풀이 1
// n = 121
class Solution {
public long solution(long n) {
if (Math.pow((int) Math.sqrt(n), 2) == n) {
return (long) Math.pow(Math.sqrt(n) + 1, 2);
}
return -1;
}
}
💡 핵심 메소드 소개
위의 코드를 예시로 소개해드리도록 하겠습니다.
1. Math.sqrt(a) : 주어진 인자 a의 제곱근을 구하는 메소드
Math.sqrt(121)
=
= 11
2. Math.pow(a,b) : 주어진 인자 a의 b 제곱을 구하는 메소드
Math.pow((int) Math.sqrt(n), 2)
= Math.pow((int) , 2)
= Math.pow((int) 11, 2)
=
저는 double → int 형 변환은 데이터 손실이 있을 수 있으므로 형 변환을 수행하지 않고 있었는데, 사실 제곱근을 구하는 것이다보니 별 상관이 없었습니다.
이걸 생각을 못해서 빙빙 돌아서 풀었었네요 😅
풀이 2
// n = 121
class Solution {
public long solution(long n) {
double i = Math.sqrt(n);
return Math.floor(i) == i ? (long) Math.pow(i + 1, 2) : -1;
}
}
💡 핵심 메소드 소개
- Math.floor(a) : 주어진 인자 a에 대해 소수점 내림을 수행
n이 제곱수일 경우
n = 4
Math.floor(Math.sqrt(4)) = 2
n이 제곱수가 아닐 경우
n = 3
Math.floor(Math.sqrt(3)) = 1 // 1.xxx..이므로
따라서 위 풀이는 삼항 연산자를 통해 n이 제곱수일 경우 / n이 제곱수가 아닐 경우를 고려하여 답을 도출해낼 수 있습니다.
풀이 3
class Solution {
public long solution(long n) {
long x = (long) Math.sqrt(n);
if (x * x == n) {
return (x + 1) * (x + 1);
}
return -1;
}
}
저는 최대한 직관적으로 풀다보니 위와 같이 풀게 되었습니다.
코딩 테스트는 풀면 풀수록, 까먹고 있던 문법 및 메소드나 좋은 풀이를 알아갈 수 있어서 좋네요 🍰