https://programmers.co.kr/learn/courses/30/lessons/12934#
코딩테스트 연습 - 정수 제곱근 판별
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다. n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함
programmers.co.kr
문제 설명
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
제한 사항
- n은 1이상, 50000000000000 이하인 양의 정수입니다.
입출력 예
n | return |
121 | 144 |
3 | -1 |
입출력 예 설명
입출력 예#1
121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다.
입출력 예#2
3은 양의 정수의 제곱이 아니므로, -1을 리턴합니다.
[문제 분석]
처음 문제를 보고 쉽다고 생각했는데, 1부터 n까지 반복문을 돌려가며 제곱근을 찾으면 시간초과가 나서 이분탐색으로 풀어보니 틀린 부분이 나와 문제 해결에 은근 시간이 많이 걸렸다.
우선 Math.sqrt를 이용해 n의 제곱근을 구한다. 이는 double 형식이다. 그래서 이를 문자열로 변경하여 str에 저장하였고, 소수점의 위치를 파악하여 잘라주었다. (ex) 1.22334 -> 1)
자른 string을 long 형식으로 변경하여 answer이라는 long 변수에 저장하였고, answer의 제곱이 n과 동일하다면 정수 제곱근을 정확히 찾은 것이니 answer+1의 제곱을 return하였다.
answer의 제곱이 n과 동일하지 않다면 이는 정수 제곱근이 아니므로 -1을 return하였다.
[코드]
import java.util.*;
class Solution {
public long solution(long n) {
String str = Double.toString(Math.sqrt(n));
int i;
for(i=0;i<str.length();i++){
if(str.charAt(i)=='.'){
break;
}
}
str = str.substring(0,i);
long answer = Long.parseLong(str);
if(answer*answer==n){
return (answer+1)*(answer+1);
}
return -1;
}
}
'Algorithm > 프로그래머스' 카테고리의 다른 글
프로그래머스_[1차] 뉴스 클러스터링(JAVA) (0) | 2021.07.03 |
---|---|
프로그래머스_오픈채팅방(JAVA) (0) | 2021.07.03 |
프로그래머스_이상한 문자 만들기(JAVA) (0) | 2021.07.03 |
프로그래머스_[1차] 다트 게임(JAVA) (0) | 2021.07.03 |
프로그래머스_[1차] 비밀 지도(JAVA) (0) | 2021.06.29 |