문제
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
제한 사항
n은 1이상, 50000000000000 이하인 양의 정수입니다.
나의 풀이
function solution(n) {
// n = 양의 정수 / x = 임의의 양의 정수
// if (n = x의 제곱) => (x+1)^2 반환
// else -1 반환
//예외처리
if (n == 1) return 4;
// for(2부터 n까지, i++)
for(let i = 2; i < n; i++) {
// if ( i * i === n) => return (i+1)^2
if(i*i === n) return (i+1) * (i+1);
// if ( i * i > n) break;
else if(i*i > n) break;
}
// else -1 반환
return -1;
}
처음 풀었을 때는 n이 1일 때의 예외처리를 하지 않아 테스트 18에서 통과되지 않았다.
예외처리를 해주자 통과는 됐지만, 속도가 느려서 완벽한 해답은 아니다.
정확도 테스트 결과
다른 풀이
Math.sqrt()
를 사용한 코드function solution(n) { // n = 양의 정수 / x = 임의의 양의 정수 // if (n = x의 제곱) => (x+1)^2 반환 // else -1 반환 // if (n의 제곱근 === n의 제곱근.floor) => (n의 제곱근+1)^2 // else return -1 let x = Math.sqrt(n); return (x === Math.floor(x)) ? (x+1)*(x+1) : -1; }
가장 간결한 풀이
속도도 빠르다
정확도 테스트 결과
while문으로 1차 선별한 코드
function solution(n){ var result = 0; var x = 0; while (x*x < n){ x++; } if (x*x == n){ x++; result = x*x; }else{ result = -1; } return result; }
이건 효율적이진 않지만, 살펴볼만한 코드다.
while문을 이용해 x*x < n 되는 부분을 걸러냈기 때문이다.
'Coding test' 카테고리의 다른 글
[프로그래머스] 콜라츠 추측 (Level 1) (0) | 2022.04.16 |
---|---|
[프로그래머스] 제일 작은 수 제거하기 (Level 1) (0) | 2022.04.15 |
[프로그래머스] 정수 내림차순으로 배치하기 (Level 1) (0) | 2022.04.15 |
[프로그래머스] 자연수 뒤집어 배열로 만들기 (Level 1) (0) | 2022.04.15 |
[프로그래머스] 자릿수 더하기 (Level 1) (0) | 2022.04.14 |