codekata

[프로그래머스] #19 정수 제곱근 판별 (** % 잘쓰기)

kinggoddino 2024. 7. 18.

▶ 문제

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 함.

n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을  리턴하는 함수 만들기

 

▶ 제한사항

n은 1이상, 50,000,000,000,000 이하인 양의 정수

 

▶ 풀이

거듭제곱 연산자 ** 를 사용해서 풀었다.

n**0.5 로 제곱근을 구하고, 그 값이 정수냐 소수냐에 따라 n이 제곱수인지를 판단할 수 있다.

  • n의 제곱근이 정수 → n은 제곱수임
  • n의 제곱근이 소수 → n은 제곱수가 아님
def solution(n):
    if type(n**0.5) == int:    # 제곱근이 정수이면
        x = n**0.5             # x = n의 제곱근
        return (x+1)**2
    else:
        return -1              # 전부다 -1 나옴...

틀림...

이렇게 했더니 모든 결과가 다 -1로 반환됐다.

n**0.5의 결과가 전부 소수로 나왔다는 뜻인데... 왜지

 

실험해보기

print(3 ** 2)             # 9
print(type(11 ** 2))      # <class 'int'>

print(81 ** 0.5)          # 9.0
print(type(81 ** 0.5))    # <class 'float'>

둘다 똑같이 결과는 9인데 타입이 다르다.

** 지수가 소수인 경우에는 연산결과가 소수로 출력된다

print(81 ** 0.25)         # 3.0
print(type(81 ** 0.25))   # <class 'float'>

print(81 ** 0.01)         # 1.0449243511440875
print(type(81 ** 0.01))   # <class 'float'>

혹시 지수가 한자리 소수라서 결과도 한자리 소수로 반환되나 했더니 그건 아니었다.

지수가 몇자리 소수던 간에

거듭제곱 연산 결과가 '사실상 정수' 이면 '한자리 소수'로 반환된다

(대체왜 이런 비효율적인?)

 

그리고 결과가 정수가 아닐경우 그냥 16자리 정도로 끊은 소수가 반환된다.

TMI - 부동 소수점 연산은 IEEE 754 표준을 따르며, 이 표준은 소수점 이하 15-17자리의 정확도를 보장합니다. 라고함.

 

근데

첨부터 다시 생각했더니 더 쉬운 방법이 있었다!

그냥 1로 나눠보고 나머지가 없으면 정수라는 말이잖아

def solution(n):
    if (n**0.5) % 1 == 0:   # 1로나눈 나머지가 0이면 제곱수
        x = n**0.5
        return (x+1)**2
    else:
        return -1

통과!

n이 정수인지 판별하는 방법  n % 1 == 0