본문 바로가기
코딩 테스트/[JAVA] programmers 코딩 테스트 연습

[Programmers/JAVA] 정수 제곱근 판별 / 프로그래머스 코딩 테스트 연습

by M개발자 2021. 6. 11.
반응형

정수 제곱근 판별


문제 설명

 

임의의 양의 정수 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;

    }
}

속도

속도는 짱 빠르다. 반복문 안 사용해서 그런가??!


github

programmers

 

반응형

댓글