개발조각

[프로그래머스] 정수 제곱근 판별 본문

알고리즘🅰/프로그래머스

[프로그래머스] 정수 제곱근 판별

개발조각 2022. 3. 3. 16:43
728x90
반응형

이번 문제는 Math에 대해 잘 아시는 분들은 쉽게 풀었을 것 같아요.

 


해결방안

function solution(n) {
    return Math.sqrt(n) % 1 ? -1 : Math.pow(Math.sqrt(n)+1, 2)
}

이번문제는 해결방안 순서를 쓰기 애매해서 바로 해결방안에 대해 설명하겠습니다.

 

이 문제를 보면 숫자n이 제곱근인지 아닌지를 판별하는 문제입니다.

그래서 조건문을 써주었는데요. 그중 삼항연산자를 써주었습니다.

 

삼항 연산자

구문 : 조건 ? true : false

  • 조건이 true이면 true를 실행
  • 조건이 false이면 false를 실행

이제 삼항 연산자 가지고 조건과 true, false에 무엇을 넣을 건가에 대해 써보자면

  • 조건 : n이 어떤 양의 정수 x의 제곱인지 아닌지 판단 -> Math.sqrt(n) % 1
  • true : n이 양의 정수 x의 제곱이 아니면 -1반환 -> -1
  • false : n이 양의 정수 x의 제곱이면 x+1의 제곱 -> Math.pow(Math.sqrt(n)+1, 2)

이렇게 구하였습니다.

 

조건 : n이 어떤 양의 정수 x의 제곱인지 아닌지 판단 -> Math.sqrt(n) % 1

Math.sqrt() 함수를 사용하면 편리하게 제곱근을 구할 수 있습니다.

 

MDN Web Docs
Math.sqrt() 함수는 숫자의 제곱근을 반환합니다.

문법 : Math.sqrt(x)

// Math.sqrt() 함수 예제
Math.sqrt(9); // 3
Math.sqrt(2); // 1.414213562373095

Math.sqrt(1);  // 1
Math.sqrt(0);  // 0
Math.sqrt(-1); // NaN

(오늘도 MDN에 들어가보니 홈페이지 ui가 바뀌었네요.)

 

그러나 여기서 구해야 되는게 제곱근을 구하자는 게 아니라 n이 양의 정수의 제곱근인지를 구해야 됩니다.

그래서 n의 제곱근 % 1를 써주었습니다.

 

만약 제곱근이 양의 정수라면

  • 5%1 = 0
  • 7%1 = 0

나머지 값이 무조건 0이 됩니다.

 

제곱근이 양의 정수가 아니라면

  • 2.34 % 1 = 0.33999999999999986
  • -2 % 1 = -0

나머지 값이 0이 아닌 모든 값이 나오게 됩니다.

 

여기서 조건을 Math.sqrt(n) % 1=== 0 이 아닌 Math.sqrt(n) % 1만 쓴 이유는

  • Math.sqrt(n) % 1 === 0이면 false값
  • Math.sqrt(n) % 1 !== 0이면 true가 됩니다.

그래서 Math.sqrt(n) % 1까지만 써주었습니다.

 

true : n이 양의 정수 x의 제곱이 아니면 -1반환 -> -1

여기는 딱히 쓰말이 없어서 다음으로 넘어가겠습니다.

 

false : n이 양의 정수 x의 제곱이면 x+1의 제곱 -> Math.pow(Math.sqrt(n)+1, 2)

Math.pow() 함수를 사용하면 제곱한 값을 구할 수 있습니다.

MDN Web Docs
Math.pow() 함수는 base^exponent 처럼 base에 exponent를 제곱한 값을 반환합니다.

문법 : Math.pow(base, exponent)

  • base : 밑 값.
  • exponent : 밑 을 제곱하기 위해 사용하는 지수.
// Math.pow()함수 예

// 간단한 예
Math.pow(7, 2);    // 49
Math.pow(7, 3);    // 343
Math.pow(2, 10);   // 1024
// 분수 지수
Math.pow(4, 0.5);  // 2 (4의 제곱근)
Math.pow(8, 1/3);  // 2 (8의 세제곱근)
Math.pow(2, 0.5);  // 1.4142135623730951 (2의 제곱근)
Math.pow(2, 1/3);  // 1.2599210498948732 (2의 세제곱근)
// 양의 지수
Math.pow(7, -2);   // 0.02040816326530612 (1/49)
Math.pow(8, -1/3); // 0.5
// 양의 밑
Math.pow(-7, 2);   // 49 (제곱의 결과값은 양수입니다.)
Math.pow(-7, 3);   // -343 (세제곱은 음수가 될 수 있습니다.)
Math.pow(-7, 0.5); // NaN (음수는 실제 제곱근을 가지지 않습니다.)
// "짝수"와 "홀수" 근이 서로 가깝게 놓여 있고
// 부동소수점 정밀도의 한계로 인해,
// 밑이 음수이며 지수가 분수라면 언제나 NaN을 반환합니다.
Math.pow(-7, 1/3); // NaN

 

그래서 Math.pow(Math.sqrt(n)+1, 2) 이렇게 써주었습니다.

 

 


여기까지 프로그래머스 정수 제곱근 판별 해결방안에 대해 설명해보았습니다.

 

728x90
반응형
Comments