[JAVA] 정수 제곱근 판별

태로미·2023년 9월 10일
0

Programmers

목록 보기
8/29
post-thumbnail

❓문제


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



🚫제한


• n은 1이상, 50000000000000 이하인 양의 정수입니다.



💻입출력 예


nreturn
121144
3-1

입출력 예#1
121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다.
입출력 예#2
3은 양의 정수의 제곱이 아니므로, -1을 리턴합니다.














📝해결


1. for문

class Solution {
	public long solution(long n) {

		long answer = 0;

		for(long i=1; i <= n; i++) {
			if(n == i*i) {
				answer = (i+1)*(i+1);
				break;
			}
			else {
				answer = -1;
			}
		}

		return answer;
	}
}
  • i가 n보다 작거나 같을 때가 조건식이므로 i가 n의 제곱근일 때보다 커지면,
    answer가 다시 -1이 되기 때문에 break문 사용.
  • i가 11일 때 answer가 144가 되지만 i가 12일 때도 반복문을 돌아서
    다시 answer를 -1로 덮어씀.
  • 답을 찾았음에도 조건식때매 한번 더 for문이 돌기에 break문 사용.

2. Math 클래스 sqrt() 메서드

class Solution {
	public long solution(long n) {

		double value = Math.sqrt(n);
		return Math.floor(value) == value ? (long)((value + 1) * (value + 1)) : -1;
	}
}
  • Java에서 특정값의 제곱근(루트)을 구하려면 java.lang.Math 클래스의 sqrt() 메서드를 사용.
    • sqrut() 메서드의 입력값과 출력값은 모두 double 타입.
    • 인자로 음수나 NaN(Not a Number)를 전달하면 NaN이 리턴됨.
  • 마지막에 다시 long타입으로 형변환.

3. Math 클래스 pow() 메서드

class Solution {
	public long solution(long n) {
		long m = -1;
		long number = (long)Math.sqrt(n);

		if(Math.pow(number, 2) == n){
			m = (long)Math.pow(number +1, 2);
		}

		return m;
	}
}
  • pow는 power를 의미하고 거듭제곱을 뜻하며,
    전달된 두개의 double형 인자를 갖고 제곱연산을 수행함. (n의 a승)
  • 제곱근이 아니라면 -1을 리턴하므로 일단 long타입의 변수 m에 -1을 저장.
  • sqrt() 메서드를 사용하여 n의 제곱근을 구하고 이를 변수 number에 저장.
  • 제곱근의 2승, 즉 처음에 주어진 숫자 n이 맞다면
    m의 값은 제곱근+1의 값을 2승한 것, 아니라면 처음에 저장한 값 -1 return.






💭마무리

  • Level_1 / 15:55
  • Point
    – Math 클래스의 다양한 메서드 활용하기

확실히 메서드를 사용하니 코드의 가독성과 효율성이 올라간다.
코테를 하면서 생긴 버릇(?)이 하나 있는데...일단 for문을 지르고 보는 것...!!!
ㅋㅋㅋ웬만해서는 for문으로 다 풀리다보니ㅠㅠㅠ일단 지르고 본다ㅠㅠㅠㅠ
하지만 Stream을 사용했을 때 더 효율이 증가하는 풀이법도 있고
위의 문제처럼 메서드를 사용하는것이 더 나을 때가 있다...!!!!
이제부터 차근차근 잘 알아보자,,,😭


profile
Here And Now

0개의 댓글