[연습문제] 정수 제곱근 판별

2024. 11. 18. 18:00입문문제

https://school.programmers.co.kr/learn/courses/30/lessons/12934

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제 설명
임의의 양의 정수 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을 리턴합니다.

특정 숫자 n이 주어졌을 때, 이 숫자가 어떤 숫자 x의 제곱인지 판별하는 문제입니다.

 

만약 n이 x의 제곱이라면, n의 제곱근은 정수이며 x일 것입니다.

제곱이 아니라면 n의 제곱근은 실수가 되겠죠.

 

따라서 n의 제곱근이 실수인지, 혹은 정수인지에 따라 조건문을 구성하여 문제를 풀어보면 될 것 같습니다.

 

정답 코드를 작성해보겠습니다.

 

1. C

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <math.h>

long long solution(long long n) {
    double sqrtN = sqrt(n);
    if (sqrtN == (int) sqrt(n)) {
        return (sqrtN + 1) * (sqrtN + 1);
    }
    return -1
}

 

2. 파이썬

def solution(n):
    # n의 제곱근을 구합니다.
    sqrt = n ** (1/2)
    # n의 제곱근이 정수 변환 시와 동일한지 확인합니다.
    if (sqrt == int(sqrt)):
        # 동일하면 (x + 1)의 제곱을 반환합니다.
        return (sqrt + 1) ** 2
    # 기본값으로 -1을 반환합니다.
    return -1

 

제곱근이 정수라면 정수 변환을 진행해도 이전과 값이 동일하다는 점을 이용하면 됩니다.