📢 문제 설명
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
⛔ 제한 사항
n은 1이상, 50000000000000 이하인 양의 정수입니다.
function solution(num) {
let answer = "";
if (num > 1) {
let division = num / 2;
for (let i = 1; i <= num; i++) {
let div = division - i;
//let div = Math.floor(division) === 0 ? num : division - i;
division = div;
if (div <= i && div !== 0) {
let endDiv = div * 2;
answer = endDiv * endDiv === num ? (endDiv + 1) * (endDiv + 1) : -1;
break;
}
}
} else {
answer = num * 2;
}
return answer;
}
📍 이랬는데 test 케이스 18번만 통과가 안됐다..
찾아보니까 1은 무조건 true가 나와야하는데 division이 나누기 2로 시작하고 i는 1부터 시작하도록 만들었기 때문..
function solution(num) {
let answer = "";
if (num > 1) {
let division = num / 2;
for (let i = 1; i <= num; i++) {
let div = division - i;
division = div;
if (div <= i && div !== 0) {
let endDiv = div * 2;
answer = endDiv * endDiv === num ? (endDiv + 1) * (endDiv + 1) : -1;
break;
}
}
} else {
answer = (num + 1) * (num + 1);
}
return answer;
}
근데 조건을 좀 더 깔끔하게 만들고 싶어, 피드백을 받았다.
더 깔끔하고 간결하게 표현하기
function solution(n) {
let answer = 0;
let square = Math.sqrt(n); // 제곱근을 구하는 메서드
let flag = Number.isInteger(square); // 값이 정수인지 체크하는 메서드(소수점이 있어도 false)
if (flag) {
answer = (square + 1) ** 2; // 제곱은 ** 로 계산할 수 있음
} else {
answer = -1;
}
return answer;
📌Math.sqrt();
제곱근을 구하는 메서드
∀x≥0,Math.sqrt(x)=x=the uniquey≥0such thaty2=x
📍 음수인 경우 NaN 반환함
📌isInterger()
📍 메서드는 주어진 값이 정수인지 판별
📍 true, false를 반환합니다.
📍 값이 NaN이거나 Infinity, 소수점이 있는 경우에도 false를 반환합니다.