BOJ

백준 1977번 완전제곱수 [C언어]

Sloth Coder 2022. 8. 8. 00:21

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