반응형
[풀이]
function solution(n) {
for (let i = 1; i <= n; i++) {
if (n === Math.pow(i, 2)) {
return Math.pow(i + 1, 2);
} else {
return -1;
}
}
}
처음에는 단순히 n을 가지고 제곱근 했을 때 값과 같으면 리턴하자 라는 생각으로 for문을 돌렸다.
근데 for문을 처음 만들 때 n의 범위를 어디까지 정해야 하는지 의문이 들었다.
그리고 결과적으로 계속 -1 만 리턴했다.
생각을 다시해야했음..
[두번째 풀이]
function solution(n) {
const int = Math.floor(Math.sqrt(n));
const doubleNum = Math.pow(int, 2);
if (n === doubleNum) {
return Math.pow(int + 1, 2);
} else {
return -1;
}
}
n이 x의 제곱이다.
x는 n의 제곱근이다.
n이 x의 제곱인 것을 정의하기 위해서는 x를 구해줘야 문제를 풀 수 있다.
따라서 x를 구하기 위해서는 Math.sqrt()를 사용해야 한다.
예시)
Math.sqrt(n)이 Math.sqrt(2)일 때, n은 2의 제곱근이므로 소수(1.4142135623730951)가 나온다.
따라서 Math.floor()를 통해 내림해준다. (정수 반환)
두번째로 이 정수의 제곱값이 n 이므로.. (변수 설정 : doubleNum)
if문을 돌려 n === doubleNum일 때 (x+1)제곱 리턴, 아니면 -1 리턴
[코드리뷰]
function solution(n) {
const int = Math.floor(Math.sqrt(n));
const squareNum = int ** 2
if (n === squareNum) {
return (int + 1) ** 2
}
return -1;
}
1. Math.pow()말고 ** 연산자를 활용해 제곱을 구할 수 있다. (훨씬 가독성이 좋아짐!!)
2. 불필요한 else 블록은 제발 제거하자.
[추가 코드]
1. Number.isInteger 활용
function solution(n) {
const squareRoot = Math.sqrt(n);
return Number.isInteger(squareRoot)
? (squareRoot + 1) ** 2
: -1;
}
1. 위와 같이 x가 n의 제곱근이기 때문에 변수로 구해준다. (x === squareRoot)
2. 제곱근 한 값이 정수이면 +1 하고 제곱, 아니면 -1 을 리턴한다.
'코딩 테스트 > Programmers - 1' 카테고리의 다른 글
[JS] 정수 내림차순으로 배치하기 (0) | 2022.10.04 |
---|---|
[JS] 자연수 뒤집어 배열로 만들기 (0) | 2022.10.04 |
[JS] 최소직사각형 (0) | 2022.10.04 |
[JS] 이상한 문자 만들기 (0) | 2022.10.02 |
[JS] 같은 숫자는 싫어 (0) | 2022.10.01 |