programmers 코딩테스트 : 정수 제곱근 판별

H·2022년 5월 9일
0

Coding Test

목록 보기
11/26

🔔 정수 제곱근 판별

📢 문제 설명
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.

⛔ 제한 사항
n은 1이상, 50000000000000 이하인 양의 정수입니다.


🔠 첫번째 코드 (test 18번 통과 X)

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;
}

📌 코드 설명

  1. 제곱근 구하기 (제곱근구하는법)
    1. 전체 나누기 / 2
    2. 위의 나누기 값 - i
    3. 음수, 0이 되면 멈추기
    4. 멈춰진 숫자 * 2 => 제곱근
  2. 제곱근 * 제곱근 === num(들어오는 수) 같은지 판별
  3. true : (기존 제곱근 + 1) * (기존 제곱근 +1 )
  4. false : -1 return;

📍 이랬는데 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를 반환합니다.

profile
🤘 돌머리도 ROCK이다! 🤘

0개의 댓글