티스토리 뷰

728x90

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

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

n return
121 144
3 -1


입출력 예 설명
입출력 예#1
121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다.

입출력 예#2
3은 양의 정수의 제곱이 아니므로, -1을 리턴합니다.

 

solution

n의 값이 매우 큽니다.

단일 for 문을 사용해서 문제를 풀 수 있겠지만 메모리 효율이 매우 떨어질 가능성이 높습니다.(이로 인해 틀린 답이 될 수도 있을 겁니다.)

그렇다면 우리는 어차피 제곱근을 만들면 되기때문에 제곱근 계산을 위해서 파이썬의 내장함수를 사용하여 풀거나 직접 연산자로 구현해도 될 것 같네요.

math 모듈을 사용한 풀이와 직접 연산자로 구현한 풀이 두가지를 구현하겠습니다.

저는 math 등의 모듈을 사용한 풀이를 그렇게 좋아하지 않아서 1번 풀이가 끌리네요.

 

solution 1. 직접 연산자를 활용한 풀이

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

n ** (1/2)는 n의 1/2승으로 제곱근을 나타냅니다.

이 값이 (x%1 == 0) -> 정수값일 때 + 1 한 값의 제곱을 반환하고 정수가 아닐경우 -1을 리턴하는 것으로 문제 풀이가 완료됩니다.

 

solution 2. math 모듈의 sqrt 함수를 사용한 풀이

import math
def solution(n):
    x = math.sqrt(n)
    if (n ** (1/2))%1 == 0: #혹은 x == int(x) 를 사용해서 정수를 확인할 수 있습니다.
        return math.pow(x+1, 2)
    return -1

math.sqrt(n)은 n의 제곱근을 구하는 함수입니다.

이 값을 판별할 때 x == int(x) 를 사용해서 정수를 확인하는 것도 가능합니다.

위와 마찬가지로 정수일경우 x+1의 제곱을, 정수가 아닐 경우 -1을 리턴하는 것으로 풀이가 끝납니다.

728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함