정수 제곱근 판별
문제 설명
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
예시
n | return |
121 | 144 |
3 | -1 |
코드 해석 및 전체 코드
타입과 형변환이 어려운 문제였다.... 너무 쉬워서 얕봤는데.... 엄청난 문제였다 👍👍🏻👍🏾
알고리즘 1
1. i²이 n보다 작거나 같을 동안 for문 반복
2. i²이 n과 같은지 판단
3. 같을 시 (i + 1)² 리턴
4. 같지 않고 i²이 더 크면 -1 리턴
1. i²이 n보다 작거나 같을 동안 for문 반복
!!!!! i를 int형으로 하니 계속 오류가 발생....해서 한참 고생했다. long 타입으로 잡아야 오류가 발생하지 않음 !!!!!
조건식이 i <= n일 경우 -1을 반환하기까지 많은 for문을 돌려야한다.
for문을 n보다 같거나 작을 때까지 반복하는 거보단 계산 과정을 한 번 더 거치는게 나을 거 같아 i <= n으로 조건식을 주었다.
2. i²이 n과 같은지 판단
3. 같을 시 (i + 1)² 리턴
pow 메서드를 사용해보았는데 속도가 평균적으로 느려서 (i + 1)²을 answer에 저장하였다.
class Solution {
public long solution(long n) {
long answer = 0;
int num = 0;
for(long i = 1; i * i <= n; i++){
if(i * i == n) {
//answer = (long)Math.pow(i+1, 2);
answer = (i + 1) * (i + 1);
return answer;
}
}
return -1;
}
}
속도
알고리즘 2
1. sqrt 메서드 사용하여 n의 제곱근 sq 선언 Math.sqrt
2. sq 제곱이 n과 같은지 비교 Math.pow
3. 같을 경우 (sq + 1)² 반환, 아닐 경우 -1 반환 Math.pow
타입 변환 잘 해야됨. !!!
n = 121
double sq = (int)Math.sqrt(n);
→ sq = 11
if(n == (long)Math.pow(sq, 2))
→ 121 == 11²(= 121) // true
return (long)Math.pow(sq+1, 2);
→return = (sq + 1)²(= 12² = 144)
사용한 메서드
a의 제곱근 구하기 Math.sqrt(double a) a의 n 제곱 구하기 Math.pow(double a, double n) |
class Solution {
public long solution(long n) {
// n = 121
double sq = (int)Math.sqrt(n);
//sq = 11
if(n == (long)Math.pow(sq, 2)){
//(long)Math.pow(sq, 2) = 121
return (long)Math.pow(sq+1, 2);
//(long)Math.pow(sq+1, 2) = 144
}
else return -1;
}
}
속도
'코딩 테스트 > [JAVA] programmers 코딩 테스트 연습' 카테고리의 다른 글
[Programmers/JAVA] 콜라츠 추측 / 프로그래머스 코딩 테스트 연습 (0) | 2021.06.12 |
---|---|
[Programmers/JAVA] 짝수와 홀수 / 프로그래머스 코딩 테스트 연습 (0) | 2021.06.11 |
[No.18] 자연수 뒤집어 배열로 만들기/ 프로그래머스 코딩 테스트 연습 JAVA (0) | 2021.06.10 |
[No.17] 자릿수 더하기 / 프로그래머스 코딩 테스트 연습 JAVA (0) | 2021.06.10 |
[No.16] 이상한 문자 만들기/ 프로그래머스 코딩 테스트 연습 JAVA (0) | 2021.06.09 |
댓글