[프로그래머스] 정수 제곱근 판별

2024. 5. 28. 20:38개인활동/코테

# def solution(n):
#     num_list = [i for i in range(1, n + 1) if n % i == 0]
#     if len(num_list) % 2 != 0:
#         answer = (num_list[len(num_list) // 2] + 1)**2
#     else :
#         answer = -1

#     return answer

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

## 어떤 수의 제곱인지 확인하기
"""
1. 약수 구하기 -> 약수의 갯수가 홀수이면? -> 어떤 수의 제곱 : 시간초과
2. 1/2를 제곱하기 -> 정수가 나오면 됨 -> n_root 계산을 하면 float형으로 나옴,  why;;; -> round를 쓰기엔 else문으로 안넘어감
3. 소수점 아래가 0인지 아닌지 확인? 1로 나누기? -> 이게 되네?
"""

세번의 시도 끝에 적절한 코드를 찾아내었다!

루트를 씌운 값을 가져와 1로 나누었을 때 나머지가 없는지, 즉 소수점 밑의 값들이 있는지 없는지를 확인해주는 과정을 거쳤다.

처음에는 약수의 개수를 활용하여 문제를 풀어보고자 하였는데, 시간초과 문제가 좀 많이 발생했다.

그래서 다른 방법을 사용한 것이 **1/2 하는 것이였고, 이 때 주의할 점은 **(1/2)를 해주어야 한다는 점이다.

그 이유는 **1/2**(1/2)는 출력값이 다르다...

print(121**(1/2))
print(121**1/2)

이렇게 출력값이 다르게 나오며, 이 때 float 형으로 반환하는 것을 확인할 수 있었다.

그렇다보니 isinstance() 함수를 사용하여 정수형인지 아닌지로 판단하는데는 어려움이 존재하였고, 최종적으로 시도한 방식이 1로 나누었을 때 나머지 값을 확인하는 것이였다.

다른 사람의 코드를 보던 중 신기한 방법을 보게 되었는데,

### 문제가 개편되어 2024년 5월 기준으로 풀 때와 출력값이 조금 다르다
def nextSqure(n):
    return n == int(n**.5)**2 and int(n**.5+1)**2 or 'no'

앞의 조건이 성립되면 무조건적으로 return할 수 있는 코드였다.

우와~