문제 정의
이번 글에서는 포인터(pointer)를 활용하여 배열의 유형을 판별하는 C 프로그램을 작성해 보겠습니다. 여기서 판별할 내용은 다음과 같습니다.
- 배열의 모든 요소가 짝수인지
- 배열의 모든 요소가 홀수인지
- 짝수와 홀수가 섞여 있는 혼합(mixed) 배열인지
해결 방법
사용자로부터 정수 배열을 입력받은 후, 해당 배열이 어떤 유형에 속하는지 화면에 출력합니다.
예시
- 입력: 5 3 1 → 출력: 홀수 배열(Odd)
- 입력: 2 4 6 8 → 출력: 짝수 배열(Even)
- 입력: 1 2 3 4 5 → 출력: 혼합 배열(Mixed)
알고리즘
포인터를 이용해 사용자가 입력한 배열의 유형을 찾기 위한 알고리즘은 다음과 같습니다.
- 1단계: 실행 시점(runtime)에 배열의 크기를 입력받습니다.
- 2단계: 배열의 각 요소를 입력받습니다.
- 3단계: 포인터 변수를 선언하고, 포인터를 이용해 배열의 모든 요소가 홀수인지 검사합니다. 모두 홀수라면 "Odd"를 출력합니다.
- 4단계: 포인터를 이용해 배열의 모든 요소가 짝수인지 검사합니다. 모두 짝수라면 "Even"을 출력합니다.
- 5단계: 위 두 조건에 해당하지 않으면 "Mixed"를 출력합니다.
C 프로그램 예제
다음은 포인터를 활용하여 사용자가 입력한 배열의 유형을 찾는 C 프로그램입니다.
#include<stdio.h>
#include<stdlib.h>
int* createArray(int);
void readArray(int, int *);
int findType(int, int *);
int main(){
int *a, n;
printf("배열의 크기를 입력하세요\n");
scanf("%d", &n);
printf("배열의 요소들을 입력하세요\n");
a = createArray(n); // 동적 할당된 메모리 주소를 받아 저장
readArray(n, a);
findType(n, a);
return 0;
}
int *createArray(int n){
int *a;
a = (int*)malloc(n * sizeof(int)); // n개의 int 공간을 동적 할당
return a;
}
void readArray(int n, int *a){
for(int i = 0; i < n; i++){
scanf("%d", a + i); // 포인터 산술 연산으로 요소 입력
}
}
int findType(int n, int *a){
int c = 0, d = 0;
for(int i = 0; i < n; i++){
if(a[i] % 2 == 0){
c++; // 짝수 개수 카운트
}
else{
d++; // 홀수 개수 카운트
}
}
if(c == n){
printf("배열의 유형은 Even(모두 짝수)입니다\n");
}
if(d == n){
printf("배열의 유형은 Odd(모두 홀수)입니다\n");
}
if(c != n && d != n){
printf("배열의 유형은 Mixed(짝수와 홀수 혼합)입니다\n");
}
return 0;
}코드 설명
createArray 함수
malloc()을 사용하여 배열 크기만큼의 메모리를 동적으로 할당하고, 그 시작 주소를 반환합니다. 이렇게 하면 컴파일 시점에 배열 크기를 몰라도 실행 중에 유연하게 배열을 생성할 수 있습니다.
readArray 함수
포인터 산술 연산(a + i)을 이용해 배열의 각 위치에 주소를 계산하고, 그곳에 값을 직접 입력받습니다. 이것이 포인터를 활용하는 핵심 부분입니다.
findType 함수
배열을 순회하면서 각 요소를 2로 나눈 나머지를 확인합니다. 나머지가 0이면 짝수 카운트(c)를, 그렇지 않으면 홀수 카운트(d)를 증가시킵니다. 이후 세 가지 경우를 비교하여 배열의 유형을 출력합니다.
참고: 원본 코드에서는 createArray(n)의 반환값을 변수에 저장하지 않아 올바르게 동작하지 않을 수 있습니다. 위 코드처럼 반환된 포인터를 반드시 변수에 대입해야 안전하게 사용할 수 있습니다.실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
배열의 크기를 입력하세요 4 배열의 요소들을 입력하세요 12 14 16 18 배열의 유형은 Even(모두 짝수)입니다
입력된 네 개의 값(12, 14, 16, 18)이 모두 짝수이므로 프로그램은 이 배열을 "Even" 유형으로 정확하게 판별합니다.