어떤 자연수를 제곱했을 때 나오는 정수를 제곱수라고 합니다. 정수 n이 매개변수로 주어질 때, n이 제곱수라면 1을 아니라면 2를 return하도록 solution 함수를 완성해주세요.
제한사항 1 ≤ n ≤ 1,000,000
2) 예시
Result Table
n
result
144
1
976
2
입출력 예 #1 144는 12의 제곱이므로 제곱수입니다. 따라서 1을 return합니다.
입출력 예 #2 976은 제곱수가 아닙니다. 따라서 2를 return합니다.
3) 풀이
1. 클래스 선언을 해줍니다
● class Solution {
클래스명은 대문자로 시작해야하고, 정답이라는 의미로 Solution이라는 단어를 사용하였습니다.
2. 정수 n을 매개변수로 하는 solution 메소드를 선언합니다.
solution은 정수를 반환하므로 데이터타입을 int로 합니다.
● public int solution(int n) {
3. 제한사항을 확인하고, 만족하지 않을 경우 예외처리합니다.
● if(1 > n || n > 1_000_000){ throw new IllegalArgumentException("n은 1 이상 1000000 이하입니다."); }
4. 정답이 될 변수 answer를 생성하고 초기화해줍니다.
for 반복문을 이용해서, i * i <= 일 때까지 i를 1씩 증가시키며 반복문을 실행해줍니다.
i * i 가 n (n이 제곱수이면) 이면 answer가 1, 아니면 2로 하고, 최종적으로 answer를 반환해줍니다.
● int answer = 0;
for(int i=0; i * i <= n; i++){ if(i * i == n){ answer = 1; } else { answer = 2; } } return answer; } }
4) 코드
class Solution {
public int solution(int n) {
if(1 > n || n > 1_000_000){
throw new IllegalArgumentException("n은 1 이상 1000000 이하입니다.");
}
int answer = 0;
for(int i=0; i * i <= n; i++){
if(i * i == n){
answer = 1;
} else {
answer = 2;
}
}
return answer;
}
}
5) 느낀점
제곱수 여부를 확인할 때, for반복문의 조건식을 i <= n이 아니라, i * i <= n으로하여 반복횟수를 줄인점을 개인적으로 만족스럽게 생각합니다... 후후...너무 기본적인것이었나...
class Solution {
public int solution(int n) {
double sqrt = Math.sqrt(n);
if (sqrt == (int) sqrt) {
return 1; // n이 제곱수인 경우
} else {
return 2; // n이 제곱수가 아닌 경우
}
}
}
좀 더 알아보니 위 코드처럼 Math.sqrt 메소드를 이용하는 방법이 있었습니다.
괄호 안에 들어가는 숫자에 루트를 씌운다고 생각하니 쉽게 이해가 가는 메소드였습니다.
double로 그 변수를 선언하고 Math.sqrt메소드를 실행한 후, 정수로 형변환 했을 때, 정수라면 n이 제곱수가 되는 것이고, 아니라면 제곱수가 아니게 되는 것이죠.