문제 설명
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
제한 사항
n은 1이상, 50000000000000 이하인 양의 정수입니다.
def solution(n):
answer = 0
if not 1 <= n and n <= 50000000000000:
return
i = 0
while i * i <= n:
if i * i == n:
return (i+1) * (i+1)
i += 1
return -1
def solution(n):
sqrt = n ** (1/2)
if sqrt % 1 == 0:
return (sqrt + 1) ** 2
return -1
'**'은 제곱을 나타내는 연산자이다. 이것만 알고 있어서 제곱근을 구할때 편하다.
일단 sqrt => squareroot => 제곱근의 약자로 명칭하였고
제곱근은 구한 뒤 1로 나눴을때 무조건 나머지는 0가 나와야 한다는 것이다.(아니라면 소수점이 있는 실수n을 기준으로 구한것이기때문에)
제한조건이 양의 정수이기 떄문에 n의 제곱근이 양의정수라면 무조건 0이어야 한다.
이렇게 한줄로 if 아니더라도
=> return 'if의 조건' and 'true일떄 결과' or 'False 일때 결과'
로 쓸 수 있다.
int()를 해주지 않으면 실수도 포함되기 때문에 int()를 해줘야한다.
def solution(n):
return n == int(n**.5)**2 and int(n**.5+1)**2 or -1
def solution2(n):
return n == (n**.5)**2 and (n**.5+1)**2 or -1
# print(int(123**.5))=>11
# print((123**.5))=>11.090536506409418
print(solution(12.25)) => -1
print(solution2(12.25)) => 20.25
n을 2제곱(**.5)을 찾아서(int로 만들기 위해서 int()해주고) 다시 제곱해 n과 비교.
sqrt라는 메소드가 담긴 모듈 math불러와 sqrt()함수를 사용했다.
def solution(n):
from math import sqrt
return -1 if sqrt(n) % 1 else (sqrt(n)+1)**2
#=> 144.0
#return -1 if sqrt(n) % 1 else (int(sqrt(n))+1)**2
#=> 144
if sqrt(n) % 1 ==> 0 이라고 따로 명시하지 않았기에 false로 간주되어 else로 넘어간다.
sqrt() 는 반환값이 실수이기 떄문에 int()로 해주면 좋다.
# return -1 if sqrt(n) % 1 else (int(sqrt(n))+1)**2
if값을 명확히 바꿔주면
# return (int(sqrt(n))+1)**2 if sqrt(n) % 1 == 0 else -1
math.sqrt(x) 함수는 x의 제곱근을 반환 => (x에 루트를 씌운 값을 반환)
1. 이 함수의 반환형 또한 float 타입입니다.
2.math.sqrt(음수)가 들어오게 된다면 ERROR 가 발생합니다. (math.sqrt(-2) 이런 식은 에러 발생)
이것과관련하여 math.pow()라는 함수나 내장함수인 pow()도 함 알아보며 좋을것 같다.
pow(a, b) : a의 b제곱을 계산해서, 반환하는 함수
math.pow(x, y) 함수는 x의 y 거듭제곱 (x의 y승)을 반환
1. 이 함수의 반환형은 언제나 float 타입입니다. (정수 타입 계산을 원한다면 내장 함수 pow 혹은 ** 을 사용하면 됩니다.)
2. 주의할 점은 x가 음수이면서 y가 실수를 집어넣은 경우에는 Error 가 나옵니다. ( math.pow (-2, 3.2) 이런 식은 에러)
3. math.pow(1.0, y)는 항상 1.0입니다. 당연한 거겠죠 이건? 1의 n 제곱은 무조건 1 일 것입니다.
4. math.pow(x, 0,0)은 항상 1.0입니다. 이것도 당연합니다. n의 0 제곱은 무조건 1입니다.