DataScience

[LV1] 정수 제곱근 판별 - python 본문

Coding Review/programmers

[LV1] 정수 제곱근 판별 - python

다크미라클 2022. 10. 2. 21:58

[Lv. 1] 정수 제곱근 판별


문제 설명

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.


제한 사항

n은 1이상, 50000000000000 이하인 양의 정수입니다.


입출력 예#1

121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다.


입출력 예#2

3은 양의 정수의 제곱이 아니므로, -1을 리턴합니다.


입출력 예시 

n return1
121 144
3 -1

풀이 및 코드 리뷰

내가 제출한 답

import math
def solution(number):
    if math.sqrt(number) == int(number**0.5):
        return (math.sqrt(number)+1)**2
    return -1
 
  • sqrt를 사용하기 위해 math 모듈을 호출하여 사용
  • 조건문을 사용하여 math을 사용한 제곱근 값[방법1]과 n의 1/2승[방법2]을 한다음 정수로 바꿔준 값과 같은 경우 x+1의 제곱을 return하고 그렇지 않은 경우 조건문을 나와 -1을 return 하도록 한다.

다른 사람의 풀이1

def nextSqure(n):
    sqrt = n ** (1/2)

    if sqrt % 1 == 0:
        return (sqrt + 1) ** 2
    return -1
 
  • 모듈을 사용하지 않고 n의 1/2승의 함수를 만들고 정수로 바꿔주는 것이 아닌 sqrt값이 n의 제곱근의 값이 맞을경우 나머지가 없지만 만약 n의 제곱근의 값이 아니라면 나머지가 float으로 표현되기 때문에 False이다.
  • x가 1로 나눠지는 정수일 경우 x+1의 제곱을 return하고, 다르면 -1을 return합니다.

다른 사람의 풀이2

def nextSqure(n):
    return n == int(n**.5)**2 and int(n**.5+1)**2 or -1
 
  • n == int(n**.5) **2 : n과 n의 1/2승에 제곱한 값과 같으면(and) int(n**.5+1)**2 다르면(or) -1

참고 자료

1. 제곱근 ( [1] sqrt()   /   [2] **0.5 ) → math.sqrt(x) 

  • 제곱근 함수의 경우 pow()함수는 다르게 math 라이브러리를 import 하여야만 사용이 가능하다.
  • math.sqrt(음수)가 들어올 경우 에러가 발생

2. 제곱 ( [1] pow()   /   [2] **2 ) → math.pow(x, y) / pow()

  • 제곱의 함수의 경우 math.pow()와 pow()가 둘다 가능하다.
  • pow()의 경우 기본 형태는 pow(x,y) 이며, 즉 x의 y승(x의 y번 제곱)을 뜻한다.
  • sqrt(음수, float)가 들어올 경우 에러가 발생

3. 소스코드 예제

import math

n = 16

# 제곱근[math.sqrt(x)]
result1 = math.sqrt(n)
print(result1)

# 제곱근[n**0.5]
result2 = n**0.5
print(result2)

# 제곱[pow() / math.pow()]
result3 = pow(n)
result4 = math.pow(n)
print(result3)
print(result4)

# 제곱[n**2]
result5 = n**2
print(result5)

결과