-
[알고리즘/자바스크립트] 완벽한 제곱근 구하기 (Find the next perfect square!)Algorithm 2019. 2. 18. 00:08
-해당 문제는 codewars사이트의 level7 문제입니다. (1~8단계 중 8단계가 가장 쉬운 레벨)-
[문제] You might know some pretty large perfect squares. But what about the NEXT one?
Complete the findNextSquare method that finds the next integral perfect square after the one passed as a parameter. Recall that an integral perfect square is an integer n such that sqrt(n) is also an integer.
If the parameter is itself not a perfect square, than -1 should be returned. You may assume the parameter is positive.
Examples:
findNextSquare(121) --> returns 144
findNextSquare(625) --> returns 676
findNextSquare(114) --> returns -1 since 114 is not a perfect
[해석] 완벽한 제곱수(Square Number)가 주어졌을 때 그 다음 제곱수를 return해라.
만약 주어진 수가 정수로 떨어지는 완벽한 제곱수가 아니라면 -1을 return해라.
초딩, 중딩 때 제곱이나 루트같은거 배우면서 이런거 배워서 어디다 써먹나 싶었는데..
성인이 되서 또 만날 줄은 몰랐다.ㅋㅋ
(내가 직장 다니면서 이런거 자진해서 공부할 날이 올지 어떻게 알았겠나 싶다.)
제곱수는 같은 수를 2번 반복해서 곱한 수를 말한다.
2 * 2 = 4
3 * 3 = 9
이렇게 4, 9 같은 수를 제곱수라고 한다.
그리고 제곱근은 그 반대다. 2와 2를 곱해서 4가 나왔다면
뭐랑 뭐를 곱해야 4가 나오는지 구하는것이 제곱근이다.
그러니까 4의 제곱근은 2가 된다.
그리고 거기서 쓰는 기호가 루트이다.
4의 제곱근은 루트 4로 표현할 수 있고 답은 2가 된다.
다시 설명하면 3의 제곱수는 9다. 3 * 3은 9니까.
반대로 9의 제곱근은 루트 9, 즉 3이 된다.
--------------------
그러면 다시 알고리즘 문제로 넘어가서..
일단 문제에서 어떤 제곱수가 주어졌을 때 그 수 바로 다음으로 큰 제곱수를 구하라고 했다.
예를 들어 121이라는 제곱수가 주어졌다. 그러면 그것보다 하나 더 큰 제곱수를 구하려면
121의 제곱근을 알아야 한다. 121의 제곱근은 루트 121, 즉 11이다.
그리고 11의 다음 수는 12이므로 12 * 12 = 144,
즉 144가 121 바로 다음으로 큰 제곱수가 된다.
1) 그럼 제일 먼저 해야 할 일은 바로 주어진 수의 제곱근을 구하는 것!
MDN 문서를 찾아보니 Math.sqrt(x)라는 내장함수로 제곱근을 구할 수 있다!
function findNextSquare(sq) { var sqN = Math.sqrt(sq) }
코드로 표현해보면 이렇다.
2) 이제 해야할 일은 sq의 제곱근인 sqN이 정수인지 실수인지 알아내야 한다.
실수라면 -1을 return해야하기 때문이다.
여기서 어떻게 해야할지 한 10분 정도 넘게 고민했는데
일단 10.567778 이런 숫자가 있다고 쳐보자.
10.567778이 정수인지 실수인지 구분하려면
10.567778에서 10을 뺐을 때 0보다 큰 수가 나오면 그 수는 실수이다.
즉
function findNextSquare(sq) { var sqN = Math.sqrt(sq) if(sqN - parseInt(sqN) !== 0) { return -1 } }
어떤 수 n에 parseInt(n)를 해주면 그 수의 정수값을 반환해준다.
실수도 정수로 변환해준다!
즉, sqN에서 sqN을 정수로 변환한 값을 뺐을 때 0 이 나오면 sqN은 정수,
0이 안나오면 sqN은 실수가 된다.
따라서 실수일 경우 -1을 return해주면 된다.
3) 마지막으로 정수인 경우에 sqN+1을 2번 곱하여 return 시키면 정답이 나온다.
function findNextSquare(sq) { // Return the next square if sq if a perfect square, -1 otherwise var sqN = Math.sqrt(sq) if(sqN - parseInt(sqN) !== 0) { return -1 } else { return (sqN+1)*(sqN+1) } }
짝짝짝!
반응형'Algorithm' 카테고리의 다른 글
[알고리즘/자바스크립트] 홀수 짝수 판별하여 map()으로 배열 재구성하기 (WeIrD StRiNg CaSe) (0) 2019.02.19 [알고리즘/자바스크립트] 삼각형 판별문제 (Is this a triangle?) (0) 2019.02.18 [알고리즘/자바스크립트] 마지막 4글자 제외하고 #으로 치환하기 (Credit Card Mask) (0) 2019.02.17 [알고리즘/자바스크립트] 특정문자 공백으로 치환해서 return하기 (Dubstep) (252) 2019.02.17 [알고리즘/자바스크립트] 최소값 구하기 / 단어 중 가장 길이가 짧은 단어의 length를 구하기 (Shortest Word) (252) 2019.02.17 COMMENT