백준문제풀이 '정수 제곱근 판별' 여러가지 방법 풀이 및 한줄표기법의 다양한 예/ math.sqrt()/math.pow()/pow()

권수민·2023년 8월 29일
1

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

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

답 코드

1. 모듈이나 라이브러리 없이 좀 비효율적일 수 있지만 n이 정수인 것을 확실하다는 점을 기반으로 코드를 작성한것

 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

2.모듈이나 라이브러리 없이 효율적으로 만들어진 코드라고 볼 수 있다.

 def solution(n):
     sqrt = n ** (1/2)
     if sqrt % 1 == 0:
         return (sqrt + 1) ** 2
     return -1

'**'은 제곱을 나타내는 연산자이다. 이것만 알고 있어서 제곱근을 구할때 편하다.

일단 sqrt => squareroot => 제곱근의 약자로 명칭하였고

제곱근은 구한 뒤 1로 나눴을때 무조건 나머지는 0가 나와야 한다는 것이다.(아니라면 소수점이 있는 실수n을 기준으로 구한것이기때문에)
제한조건이 양의 정수이기 떄문에 n의 제곱근이 양의정수라면 무조건 0이어야 한다.

3. if 없이 if 한줄표기법???

이렇게 한줄로 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과 비교.

4.if 문 한줄 표기법

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()/math.pow()/pow()

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입니다.

profile
초보개발자

0개의 댓글