본문 바로가기
Computer Science/PS

[PS] 12934. 정수 제곱근 판별

by BrickSky 2023. 11. 19.

1) 문제: 12934. 정수 제곱근 판별

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.

n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.

제한사항

• n은 1 이상, 50000000000000 이하인 양의 정수입니다.

입출력 예 설명

return
121 144
3 -1

 

2) 나의 첫 풀이

변수 하나를 만들고 for(int x=0; x <n; x++) 식을 만들어준 다음 x의 제곱을 했을 때 n이 나오면 x+1의 제곱을 리턴하고 아니면 -1을 리턴하는 식을 구현할 것이다.

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

long long solution(long long n) {
    long long answer = 0;
    long long x = 0;
    
    if(n>=1 && n<=50000000000000){
        for(x=0; x<n; x++){
            if(n= x * x){
                answer = (x+1) * (x+1);
            }
            else if(n != x * x){
                answer = -1;
            }
        }
    }
    return answer;
}

아무리 봐도 틀린 부분이 없는 것 같은데, 결괏값이 0이 나온다.
 

3) 수정한 풀이

  • 대입 연산자를 잘못 사용했다.
    • n이 x의 제곱인 경우를 의미하는 코드는 n = xx가 아닌, n == xx여야 한다.
    • =은 값을 넣어주는 거고, ==이 값이 같은지 확인하는 것!
  • break 문을 사용하지 않았다.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

long long solution(long long n) {
    long long answer = 0;
 
    if(n>=1 && n<=50000000000000){
        for(double x=0; x<=n; x++){
            if(n == x * x){
                answer = (x+1) * (x+1);
                break;
            } else {
                answer = -1;
            }
        }
    }
    return answer;
}

 

4) 배운 점

break문

break문은 반복문(주로 forwhile 루프)을 중단하고 루프를 빠져나가게 하는 역할을 한다.
break문은 보통 특정 조건이 충족되었을 때 루프를 빠져나가기 위해 사용한다.
바로 위에서도 ==을 통해 만족하면 빠져나와야 하는 것이다. 빠져나오지 않아 어떤 값을 입력해도 -1이 나왔던 것이다.

for (x = 0; x * x <= n; x++) {
    if (n == x * x) {
        answer = (x + 1) * (x + 1);
        break; // 제곱근을 찾았으므로 루프 종료
    }
}

for 루프에서 x * x <= n 조건이 만족될 동안 반복하면서 if (n == x * x)에서 answer를 설정하고,
그 후에 break문이 실행되면 루프가 종료가 되는 것. 이렇게 하면 루프는 x * x == n인 경우에만 실행되고,
그 외의 경우에는 제어가 루프 바깥으로 나가게 되는 것이다.