본문 바로가기

코딩테스트 스터디

코딩테스트 연습 - 제곱수 판별하기 (JAVA)

프로그래머스 코딩테스트 입문 0단계 문제입니다

https://school.programmers.co.kr/learn/courses/30/lessons/120909

 

📢 문제 설명

어떤 자연수를 제곱했을 때 나오는 정수를 제곱수라고 합니다. 정수 n이 매개변수로 주어질 때, n이 제곱수라면 1을 아니라면 2를 return하도록 solution 함수를 완성해주세요.

 

 

⭕ 정답 코드

class Solution {
    public int solution(int n) {
        return (n % Math.sqrt(n)  == 0) ? 1 : 2;
    }
}

🔍 해설

Math.sqrt()메서드: 제곱근을 구해주는 메서드

 

①: Math.sqrt()로 n의 제곱근을 구해준다

②: n으로 나눈 나머지 값이 0이라면

③: 1을 반환, 아니라면 2를 반환해준다

 

 

⚠️ 직접 풀어본 처음 풀이

1) Math.pow() 메서드 사용

class Solution {
    public int solution(int n) {
        return (int)Math.pow( (int)Math.pow(n, 0.5) , 2 )==n ? 1 : 2;
    }
}

🔍 해설

Math.pow()메서드를 중첩, 삼항연산자 사용

 

①: 내부에 있는 메서드는 주어진 숫자를 0.5(2분의 1) 제곱하여 int로 형변환

        ❓ 왜 형변환을 해줘야하나요?

         ▶️ 형변환을 해주지 않으면 제곱수가 아닌 경우 소수점 아래로 많은 숫자가 붙게 됩니다. 여기서 제곱을 해주면 컴파일러가 제곱을 했을때 n과 매우 가까운 숫자가 나와서 n이 아닌데도 n으로 처리합니다. 그래서 형변환으로 많은 소수자리들을 없애주어야 정확한 값이 나오게 됩니다.

 

②: 외부에 있는 메서드에서 ①에서 구한 값으로 제곱하여 int로 형변환

 

③: 삼항연산자로 ②의 값과 n과 비교하여 값반환

 

2) 1000번 반복하기

class Solution {
    public int solution(int n) {
        int answer = 2;
        for(int i = 1; i<=1000; i++)
            if(i*i == n) answer = 1;
        return answer;
    }
}

🔍 해설

①: answer의 초기값을 2로 설정

        ❓ 왜 초기값이 2인가요?

         ▶️ 제곱수가 아니라면 조건문 안의 명령문까지 도달하지 않기 때문에 값이 변하지 않습니다. 그래서 코드의 효율성을 위해 2로 설정합니다.

 

②: 제한사항에 따라 1부터 1000(제곱하면 1,000,000인 수)까지 반복

 

③: 제곱했을때 n이면 answer의 값을 1로 바꾼다

 

📒 기억하고 갈 문법

Math.pow(제곱할 수, 지수) :  '제곱할 수'를 '지수'만큼 제곱해주는 메서드

Math.sqrt(숫자) :  '숫자'의 제곱근을 구해주는 메서드

Math.pow(12, 2); //144
Math.pow(144, 0.5); //12

Math.sqrt(144); //12