1) 문제: 12934. 정수 제곱근 판별
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
제한사항
• n은 1 이상, 50000000000000 이하인 양의 정수입니다.
입출력 예 설명
n | 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문은 반복문(주로 for나 while 루프)을 중단하고 루프를 빠져나가게 하는 역할을 한다.
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인 경우에만 실행되고,
그 외의 경우에는 제어가 루프 바깥으로 나가게 되는 것이다.
'Computer Science > PS' 카테고리의 다른 글
[PS] 12912. 두 정수 사이의 합 (2) | 2023.11.19 |
---|---|
[PS] 12947. 하샤드 수 (1) | 2023.11.19 |
[PS] 12932. 자연수 뒤집어 배열로 만들기 (2) | 2023.11.18 |
[PS] 12925. 문자열을 정수로 바꾸기 (2) | 2023.11.18 |
[PS] 12931. 자릿수 더하기 (1) | 2023.11.18 |