Sol1) 배열을 사용하지 않은 풀이
#include <stdio.h>
#include <math.h>
int main()
{
int from, to, min; //min = 가장 작은 완전 제곱수를 저장할 변수
int cnt = 0, sum = 0, flag = 0; //flag로 처음 들어오는 완전 제곱수를 체크한다.
scanf("%d", &from);
scanf("%d", &to);
for(int i = from; i <= to; i++){
if(sqrt(i) == (int)sqrt(i)){ //squared root함수는 double형을 반환하므로, 만일 어떤 수가
cnt++; //완전 제곱수가 아니라면 소수점이 달려서 반환될 것이다. 이를 int로 형변환하면
sum += i; //소수점아래 자리 숫자들이 버려져 원래 sqrt(i)의 값과 달라질 것이다.
if(flag == 0){ //flag가 아직 0이라는 것은 처음 들어온 완전 제곱수라는 뜻이다.
flag = 1; //오름차순으로 찾고 있으므로 처음 들어온 완전제곱수 = 가장 작은 완전 제곱수.
min = i;
}
}
}
if(cnt == 0) //카운트가 0이라면 완전제곱수를 하나도 찾지 못했다는 뜻이므로.
printf("-1\n");
else
printf("%d\n%d\n", sum, min);
return 0;
}
flag와 min이라는 변수를 사용하는 대신, 배열을 이용해 풀 수도 있다.
다만, 완전제곱수의 개수를 알 수 없으므로 배열 크기를 충분히 크게 설정해줘야 하기 때문에 메모리의 낭비가 발생하는것 같아 위와 같이 풀었다.
Sol2) 배열을 이용한 풀이
#include <stdio.h>
#include <math.h>
int main()
{
int from, to;
int cnt = 0, sum = 0; //flag로 처음 들어오는 완전 제곱수를 체크한다.
int ans[10000];
scanf("%d", &from);
scanf("%d", &to);
for(int i = from; i <= to; i++){
if(sqrt(i) == (int)sqrt(i)){ //squared root함수는 double형을 반환하므로, 만일 어떤 수가
ans[cnt] = i; //완전 제곱수가 아니라면 소수점이 달려서 반환될 것이다. 이를 int로 형변환하면
cnt++; //소수점아래 자리 숫자들이 버려져 원래 sqrt(i)의 값과 달라질 것이다.
sum += i;
}
}
//for(int k = 0; k < cnt; k++){
// sum += ans[k];
// } 와 같이 합은 따로 구해줘도 된다.
if(cnt == 0) //카운트가 0이라면 완전제곱수를 하나도 찾지 못했다는 뜻이므로.
printf("-1\n");
else
printf("%d\n%d\n", sum, ans[0]);
return 0;
}
'BOJ' 카테고리의 다른 글
백준 2747번 피보나치 수 [C언어] (0) | 2022.08.15 |
---|---|
백준 2863번 이게 분수? [C언어] (0) | 2022.08.13 |
백준 1018번 체스판 다시 칠하기 [C언어] (0) | 2022.08.10 |
백준 1436번 영화감독 숌 [C언어] (0) | 2022.08.07 |
#2577(java) (0) | 2022.07.02 |