정수 제곱근 판별
by Cori문제
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다. n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수 solution을 완성하세요.
제한사항
· n은 1이상, 50000000000000이하인 양의 정수입니다.
입출력 예
n | return |
121 | 144 |
3 | -1 |
풀이
1. Me
from math import sqrt
def solution(n):
if sqrt(n) * sqrt(n) == n:
return int((sqrt(n)+1) * (sqrt(n)+1))
else:
return -1
정확성 테스트에서 몇 문제를 틀렸는데, 어떤 경우에 정답이 되지 않는지 찾아내지 못했다.. sqrt 메서드는 숫자 x의 제곱근을 반환하기 때문에, 입력받은 수의 제곱근 * 입력받은 수의 제곱근 == 입력받은 수라면 문제에서 요구하는 값을 리턴하도록 작성하였는데, 특정 케이스에서 오류 발생
2. Others
def nextSqure(n):
sqrt = n ** (1/2)
if sqrt % 1 == 0:
return (sqrt + 1) ** 2
return 'no'
math 라이브러리의 sqrt 함수를 사용하지 않고, 제곱근을 구했다. n ** (1/2)를 수행하면 제곱근이 된다 ! 이후 'sqrt % 1 == 0' 연산을 활용하여 n의 제곱근이 정수인지 확인하였다. 해당 표현식을 알아두자.
from math import sqrt
def nextSqure(n):
return "no" if sqrt(n) % 1 else (sqrt(n)+1)**2
위에 있던 코드를 표현식을 이용해 간결하게 작성하였다.
def nextSqure(n):
return n == int(n**.5)**2 and int(n**.5+1)**2 or 'no'
return에 and와 or이 사용되었다. 해당 표현식에 좀 더 공부해보자. 맞는거 같긴 한데 내 생각으로는, return 문에 or과 and 연산자를 사용하기 위해서는 return 바로 다음에 나오는 식이 True 또는 False를 return 해야 한다. 위 코드에서는 n이 어떤 정수의 제곱일 경우 'n == int(n ** .5) ** 2' 표현식에서 True를 리턴하고, 이에 and 바로 뒤에 있는 값을 계산하여 리턴한다. 그렇지 않을 경우, False 값을 반환한다.
* return에 and, or이 사용된 다른 예시
def solution(arr, divisor):
return sorted([item for item in arr if item % divisor == 0]) or [-1]
sorted된 리스트가 빈 리스트라면(거짓) or에 의해 참 값(-1)을 리턴함
* 이번 문제를 통해 알 수 있었던 것은, 정수인지 여부를 확인하기 위해 '궁금한 값 % 1' 표현식을 사용한다는 것
블로그의 정보
코딩하는 오리
Cori