• Jan
  • Feb
  • Mar
  • Apr
  • May
  • Jun
  • Jul
  • Aug
  • Sep
  • Oct
  • Nov
  • Dec
  • Sun
  • Mon
  • Tue
  • Wed
  • Thu
  • Fri
  • Sat
  • 27
  • 28
  • 29
  • 30
  • 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
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

# 12934 정수 제곱근 판별

image

문제 정리

n이 x의 제곱이면 x+1의 제곱 리턴. 아니면 -1리턴

생각해보기

n이 어떤 수의 제곱인지 어떻게 알지? 인수분해?^^ 하
제곱수의 배열을 만들어서 저장해 놓은 후 일치하는지 봐야하나? 안돼.. 상한선이 너무 큼

메모이제이션 이런걸 써야하는건가?

큰 수를 작은 제곱수들로 나눠보면서 ..인수분해 하듯이 해보자

코드 쓰기

long long solution(long long n) {
    long long answer = 0;
    vector<long long> v = {1};
    
    long long num = 2;
    long long r = 0; // 나머지
    
    do{
        if(v.size() < num) { v.push_back(num*num); }
        if(n == 1) { answer = 4; break; } else {
            if (n % v[num-2] == 0){
                r = n / v[num-2];
                answer += num;
            }
        }
        
        num++;
    }while(r != 0);
    
    return answer;
}

이렇게 하니까 메모리 초과 ^^ ㅋ

내 풀이

long long solution(long long n) {
    long long answer = 0;
    int num = (int)(sqrt(n));
    
    if (num == sqrt(n)){
        answer = (pow(num+1, 2));
    } else {
        answer = -1;
    }
    
    return answer;
}

결국 그냥 검색해서 cmath 썼다ㅠㅠ 제곱근을 int로 변환해도 같으면
n이 어떤 정수의 제곱이라는 뜻이니까.. 하 ㅠ

풀고 나서 알게된 것

long long solution(long long n) {
    long long answer = 0;

    long long i;
    for(i=1; i*i<=n; i++);
    if((i-1)*(i-1)==n)
    {
        answer = i*i;
    }

    else{
        answer = -1;
    }



    return answer;
}

이렇게 하면 하나하나 비교해가며 풀 수 있다..! ㄷ ㄷ 이렇게 그냥 하나하나 찾아도 되는구나…;;