문제
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
제한 사항
- n은 1 이상 50,000,000,000,000 이하인 양의 정수입니다.
입출력 예
n | return |
121 | 144 |
3 | -1 |
입출력 예 #1
: 121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다.
입출력 예 #2
: 3은 양의 정수의 제곱이 아니므로, -1을 리턴합니다.
나의 풀이
일단, 첫 번째 풀이는 실패했다. 18개의 테스트 코드 중 한 개 빼고 다 맞았지만 무슨 이유에선지 하나의 테스트 코드에서 실패가 떴다.
function solution(n) {
var answer = 0;
for(let i=1;i<n;i++){
if(n===i**2){
return (i+1)**2;
}
}
return -1;
};
일단 이렇게 풀었는데 for문을 돌리다가 n이 어떤 i의 제곱일 때는 for 문을 빠져나와야 겠다는 생각이 들어 어떤 수의 제곱일 때는 break를 써서 빠져나오도록 했다.
function solution(n) {
var answer = 0;
for(let i=1;i<n;i++){
if(n===i**2){
answer = (i+1)**2;
break;
} else {
answer = -1;
}
}
return answer;
}
그런데 이것도 위의 코드와 마찬가지로 1가지 경우에서 틀렸다.
결국 다른 방식으로 풀어보기로 했다.
나의 풀이2
직관적으로 제곱근을 구해주는 sqrt()메서드를 사용해 풀어봤다.
그런데 주어진 조건에서 '양의 정수의 제곱' 이라는 조건이 붙어 있었기 때문에 제곱근으로 만든 것이 정수인지를 판별할 수 있는 조건이 필요했다. 따라서 '1로 나눠서 나누어 떨어지면 정수'라는 조건을 넣어주게 되었다.
function solution(n){
var answer = 0;
if(Math.sqrt(n)%1 ===0){
answer = (Math.sqrt(n)+1)**2;
} else {
answer = -1;
}
return answer;
}
다른 코드들과 똑같이 푼 것 같다고 생각하는데 이 코드만 테스트 코드를 전부 통과했다.
'Algorithm' 카테고리의 다른 글
[1차] 비밀지도 [프로그래머스] (2) | 2023.10.16 |
---|---|
정수 내림차순으로 배치하기 [프로그래머스] (1) | 2023.10.16 |
문자열을 정수로 바꾸기 [프로그래머스] (0) | 2023.10.16 |
자릿수 더하기 [프로그래머스] (0) | 2023.10.16 |
자연수 뒤집어 배열로 만들기 [프로그래머스] (0) | 2023.10.16 |