프로그래머스 정수 제곱근 판별 알고리즘 문제
https://programmers.co.kr/learn/courses/30/lessons/12934
문제 설명
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
제한 사항
- n은 1이상, 50000000000000 이하인 양의 정수입니다.
입출력 예
입출력 예 설명
입출력 예#1
121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다.
입출력 예#2
3은 양의 정수의 제곱이 아니므로, -1을 리턴합니다.
< 문제 풀이 >
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
// let n = 121;
let n = 3;
solution(n);
// function solution(n) {
// let sqroot = Math.sqrt(n);
// if(sqroot % 1 === 0){
// return (sqroot + 1)*(sqroot + 1);
// }else {
// return -1;
// }
// return Math.sqrt(n)%1 === 0 ? (sqroot+1)**2 : -1
// }
//위 코드랑 똑같지만 줄여서 제출하고 싶어서 줄였다.
function solution(n) {
return Math.sqrt(n)%1 === 0 ? (Math.sqrt(n)+1)**2 : -1;
}
제곱이라는 말을 보자마자 math.abs 가 떠올랐다. 그래서 바로 Math() 함수를 검색하고, 제곱근을 구해주는 함수는 Math.sqrt 라는 것을 알게되었다. math.abs는 절대값을 구해주는 함수였다. 그래서 다시 돌아가보자면,
입출력 예#1121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다.
입출력 예#23은 양의 정수의 제곱이 아니므로, -1을 리턴합니다.
입출력예를 보면, 양의 정수의 제곱이라는 말이 써있다. 그래서 이걸 보자마자 그럼 소수점이 있는 것을 바로 -1로 리턴해주면 되겠다고 생각했다. 그래서 정수를 구하는 방법에 대해서 찾아보았다. 정수는 1로 나누었을 때 나누어 떨어지기 때문에 이것을 활용해보기로 하였다. x의 제곱 = n 이어야 true. 그럼 x = n의 제곱근. 그래서 n 제곱근이 나누어 떨어지는 것이라고 하면 양의 정수이므로 true. 만약 나누어 떨어지지 않는다면, 소수점이 있는 것이기 때문에 양의 정수의 제곱이 아니므로 false. 그래서 이 조건을 검사해준다. 그리고 true 일 경우에는 x가 n의 제곱근이므로 **를 사용해 제곱해주고, 아닐 경우는 -1을 리턴한다.
다른 사람들은 어떻게 풀었을까?
https://programmers.co.kr/learn/courses/30/lessons/12934/solution_groups?language=javascript
'Algorithm' 카테고리의 다른 글
[알고리즘] #12 부족한 금액 계산하기 | 프로그래머스 (0) | 2022.01.20 |
---|---|
[알고리즘] #14 나누어 떨어지는 숫자 배열 | 프로그래머스 (0) | 2022.01.20 |
[알고리즘] #26 제일 작은 수 제거하기 | 프로그래머스 (0) | 2022.01.20 |
[알고리즘] #28 하샤드 수 | 프로그래머스 (0) | 2022.01.20 |
[알고리즘] #27 콜라츠 추측 | 프로그래머스 (0) | 2022.01.20 |