코딩 테스트/[JAVA] programmers 코딩 테스트 연습

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

M개발자 2021. 6. 11. 01:55
반응형

정수 제곱근 판별


문제 설명

 

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

 

반응형