[Java] programmers lv 1. 정수 제곱근 판별

Eunbi Lee·2023년 6월 7일
1

Algorithm

목록 보기
3/7
post-thumbnail

문제 설명

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.

제한 조건
n은 1이상, 50000000000000 이하인 양의 정수입니다.

입/출력 예

n = 121 / return 144
n = 3 / return -1

풀이 1

// n = 121
class Solution {
  public long solution(long n) {
  	if (Math.pow((int) Math.sqrt(n), 2) == n) {
    	return (long) Math.pow(Math.sqrt(n) + 1, 2);
    }
    
    return -1;
    }
 }

💡 핵심 메소드 소개

위의 코드를 예시로 소개해드리도록 하겠습니다.

1. Math.sqrt(a) : 주어진 인자 a의 제곱근을 구하는 메소드

  • return type : double

Math.sqrt(121)
= 121\sqrt 121
= 11

2. Math.pow(a,b) : 주어진 인자 a의 b 제곱을 구하는 메소드

Math.pow((int) Math.sqrt(n), 2)
= Math.pow((int) 121\sqrt 121, 2)
= Math.pow((int) 11, 2)
= 11211^2

저는 double → int 형 변환은 데이터 손실이 있을 수 있으므로 형 변환을 수행하지 않고 있었는데, 사실 제곱근을 구하는 것이다보니 별 상관이 없었습니다.

이걸 생각을 못해서 빙빙 돌아서 풀었었네요 😅

풀이 2

// n = 121
class Solution {
  public long solution(long n) {
    double i = Math.sqrt(n);
    return Math.floor(i) == i ? (long) Math.pow(i + 1, 2) : -1;
  }
}

💡 핵심 메소드 소개

- Math.floor(a) : 주어진 인자 a에 대해 소수점 내림을 수행

  • n이 제곱수일 경우
    n = 4
    Math.floor(Math.sqrt(4)) = 2

  • n이 제곱수가 아닐 경우
    n = 3
    Math.floor(Math.sqrt(3)) = 1 // 1.xxx..이므로

따라서 위 풀이는 삼항 연산자를 통해 n이 제곱수일 경우 / n이 제곱수가 아닐 경우를 고려하여 답을 도출해낼 수 있습니다.

풀이 3

class Solution {
    public long solution(long n) {
        long x = (long) Math.sqrt(n);
        
        if (x * x == n) {
            return (x + 1) * (x + 1);
        }
        
        return -1;
    }
}

저는 최대한 직관적으로 풀다보니 위와 같이 풀게 되었습니다.


코딩 테스트는 풀면 풀수록, 까먹고 있던 문법 및 메소드나 좋은 풀이를 알아갈 수 있어서 좋네요 🍰

profile
B - B = 이은비

0개의 댓글