코딩 테스트/Programmers - 1

[JS] 정수 제곱근 판별

hayeonn 2022. 10. 4. 22:56
반응형

[풀이]

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 을 리턴한다.