Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어 포인터로 배열 내 완전제곱수 요소의 합 구하기

문제 정의

이번 글에서는 포인터(pointer)를 사용하여 배열에 있는 완전제곱수(perfect square) 요소들의 합을 구하는 C 프로그램을 작성하는 방법을 알아보겠습니다.

배열의 크기와 요소들을 입력으로 받은 뒤, 그중 완전제곱수에 해당하는 값들만 골라 합산한 결과를 출력하는 것이 목표입니다.

문제 이해

예를 들어 다음과 같은 배열이 주어졌다고 가정해 보겠습니다.

입력 = 1, 2, 3, 4, 5, 9, 10, 11, 16
완전제곱수 = 1, 4, 9, 16
합 = 1 + 4 + 9 + 16 = 30
출력: 30

완전제곱수란 어떤 정수의 제곱으로 표현할 수 있는 수를 말합니다. 즉, 1(=1²), 4(=2²), 9(=3²), 16(=4²)처럼 제곱근을 취했을 때 정수가 되는 수입니다.

알고리즘

포인터를 사용하여 배열 내 완전제곱수 요소의 합을 구하는 절차는 다음과 같습니다.

1단계 — 실행 시점에 배열의 요소 개수(n)를 입력받습니다.

2단계 — n개의 배열 요소를 차례대로 입력받습니다.

3단계 — 합을 저장할 변수 sum을 선언하고 0으로 초기화합니다.

4단계 — 배열을 가리킬 포인터 변수를 선언합니다.

5단계 — 포인터 연산(*(a+i))으로 각 요소에 접근하면서 해당 값이 완전제곱수인지 검사합니다.

6단계 — 완전제곱수라면 sum = sum + 해당 요소를 수행합니다.

7단계 — 모든 요소를 검사한 후 최종 sum 값을 반환합니다.

완전제곱수 판별 원리

코드에서는 math.h 헤더 파일에 포함된 두 함수를 활용합니다.

  • sqrt() : 값의 제곱근을 계산합니다.
  • pow() : 거듭제곱을 계산합니다.

어떤 수 x의 제곱근 m = sqrt(x)를 구한 뒤, pow(m, 2)를 다시 계산했을 때 x와 같다면 x는 완전제곱수입니다. 만약 제곱근이 정수가 아니라면 소수점 이하가 잘려나가면서 값이 달라지므로 완전제곱수가 아닌 것으로 판별할 수 있습니다.

예제 코드

다음은 포인터를 사용하여 배열 내 완전제곱수 요소의 합을 구하는 전체 C 프로그램입니다.

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int sumPositive(int n,int *a){
    int i,sum=0,m;
    for(i=0;i<n;i++){
        m=sqrt(*(a+i));
        if(pow(m,2)==*(a+i)){
            sum+=*(a+i);
        }
    }
    return sum;
}
int main(){
    int i,*a,n;
    printf("Enter the size of array:\n");
    scanf("%d",&n);
    a=(int*)malloc(n*sizeof(int));
    printf("Enter the elements of array:\n");
    for(i=0;i<n;i++){
        scanf("%d",a+i);
    }
    printf("Sum of positive square elements is %d",sumPositive(n,a));
    return 0;
}

코드 설명

  • malloc()을 사용해 실행 시간에 입력받은 크기만큼 int형 메모리를 동적으로 할당합니다.
  • 배열 이름 a 자체가 첫 번째 요소의 주소이므로, a+i는 i번째 요소의 주소를 의미합니다.
  • 역참조 연산자 *를 붙인 *(a+i)를 통해 i번째 요소의 실제 값에 접근합니다.
  • sumPositive() 함수는 모든 요소를 순회하며 완전제곱수만 골라 합산한 뒤 그 결과를 반환합니다.

실행 결과

위 프로그램을 컴파일하여 실행하면 다음과 같은 결과를 확인할 수 있습니다.

Enter the size of array:
10
Enter the elements of array:
1
2
3
4
5
6
7
8
9
10
Sum of positive square elements is 14

1부터 10 사이의 완전제곱수는 1, 4, 9 세 개이므로 1 + 4 + 9 = 14가 출력되는 것을 볼 수 있습니다.