Post

[Programmers] #120909 - 제곱수 판별하기 [Java][C++][Python]

[Programmers] #120909 - 제곱수 판별하기 [Java][C++][Python]

문제 링크


1. 아이디어

정수 n에 대해 n이 제곱수인지 여부를 판단하는 문제로 1부터 제곱수를 구해 n과 동일한지 비교하는 방식으로 해결해도 되고, 제곱근을 구하는 내장 함수를 활용해서 해결해도 된다.


2. 복잡도

접근시간공간
풀이$O(1)$$O(1)$

3. 코드

풀이 [Java][C++][Python]

1
2
3
4
5
6
class Solution {
    public int solution(int n) {
        long r = Math.round(Math.sqrt(n));
        return r * r == n ? 1 : 2;
    }
}

Math.sqrtn의 제곱근을 실수로 구한 뒤 Math.round로 반올림을 했다. 부동소수점 오차가 아주 미미하므로 반올림을 하면 올바른 후보를 구할 수 있다. 이후 r * r == n으로 nr의 제곱수인지 판정했다.

1
2
3
4
5
6
7
#include <bits/stdc++.h>
using namespace std;

int solution(int n) {
    int r = round(sqrt(n));
    return r * r == n ? 1 : 2;
}

std::sqrtn의 제곱근을 실수로 구한 뒤 std::round로 반올림을 했다. 부동소수점 오차가 아주 미미하므로 반올림을 하면 올바른 후보를 구할 수 있다. 이후 r * r == n으로 nr의 제곱수인지 판정했다.

1
2
3
4
5
6
import math


def solution(n):
    r = math.isqrt(n)
    return 1 if r * r == n else 2

math.isqrt를 활용하면 n의 정수 제곱근(= 제곱해서 n을 넘지 않는 최대 정수)을 구할 수 있다. 이후 r * r == n으로 nr의 제곱수인지 판정했다.


This post is licensed under CC BY 4.0 by the author.