초보 개발자의 이야기, 릿허브

[C++] 프로그래머스 정수 제곱근 판별 본문

코딩테스트/📘 프로그래머스 (programmers)

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

릿99 2021. 9. 17. 09:46
728x90
반응형
1. 문제이해

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

 

코딩테스트 연습 - 정수 제곱근 판별

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

programmers.co.kr

 

임의의 양의 정수 n이 다른 양의 정수 x의 제곱인지를 판단하는 것이 목표이다.

x의 제곱이라면, (x+1)의 제곱을 리턴하고, 아니라면 -1을 반환해야 한다.

 

 

 

2. 문제풀이

 

주어진 정수의 제곱근이 정수인지 아닌지를 판별하는 문제이다.

제곱근이 정수인지 판단하는 방법은 생각보다 간단하다.

 

예를 들어, 4의 양의 제곱근은 sqrt(4) = 2이다.

그리고 이 sqrt(2)의 정수 값 또한 2이다.

두 값이 같으므로, 4의 제곱근은 정수이다.

 

또 다른 예로, 3의 양의 제곱근은 sqrt(3) = 1.xxxxx이다.

이 sqrt(3)의 정수값은 1이다.

sqrt(3)의 값과, sqrt(3)의 정수값이 서로 일치하지 않으므로,

3의 제곱근은 정수가 아님을 알 수 있다.

 

즉, 해당 정수의 제곱근 값과, 제곱근 값의 정수값이 같으면 제곱근이 정수,

아니라면 정수가 아닌 것으로 판별할 수 있다.

문제의 주어진 틀은 다음과 같았다.

 

 

 

 

3. 소스코드
#include <cmath>
#include <string>
#include <vector>

using namespace std;

long long solution(long long n) {
    long long answer = 0;
    
    // n의 제곱근, n의 제곱근 값의 정수부분 값이 같으면
    // n의 제곱근이 정수인것 
    if(sqrt(n) - (long long)(sqrt(n)) == 0) {
    	// (제곱근 값 + 1)의 제곱을 반환
        answer = (square_root + 1) * (square_root + 1);
    }
    
    else {	// 아니라면 -1 반환
        answer = -1;
    }
    
    return answer;
}

문제풀이에서 도출한 방식에 따라 코드를 구현해보았다.

여기서, n은 1이상, 50000000000000 이하인 양의 정수인 조건이 주어졌으므로,

int형 대신 long long 형을 사용했다. (틀도 long long 형으로 주어졌다.)

 

n의 제곱근 값과, 제곱근 값의 정수부분이 같다면 둘의 차가 0이므로,

if문을 통해 위와 같이 구현했다. (if(sqrt(n) - (long long)(sqrt(n)) == 0))

(앞에 long long 형을 붙이게 되면, int 형을 붙인것과 같이 앞의 정수부분만 남게 된다.

즉, 3의 경우, 3.xxxx... - 3 이 되어 값이 0.xxxx.... 가 나오게 된다.)

제곱근 값이 정수라면 (제곱근+1) 의 제곱값을 반환, 아니라면 -1을 반환했다.

 

 


어제 올렸어야 하는 문제인데 임시저장만 해놓고 못올렸다..😭😭

다음부터는 잘 확인해야지..😤

 

 

 

 

 

 

728x90
반응형