C/Chapter07. 배열

lullaby ·2025년 10월 1일

C언어

목록 보기
7/10
post-thumbnail

1. 배열의 기본 개념

배열이란?

  • 같은 데이터형의 변수들을 메모리에 연속적으로 할당하고 같은 이름으로 사용하는 방법
  • 배열의 각 요소는 개별 변수처럼 사용 가능
  • 인덱스(index)를 통해 배열 요소에 접근 (0부터 시작)

배열의 선언 문법

자료형 배열명[크기];

예시:

int arr[5]; // 5개의 정수를 저장할 수 있는 배열

배열 사용 시 주의사항

  • 배열의 크기는 반드시 0보다 큰 정수형 상수로 지정
  • 유효한 인덱스 범위: 0 ~ (배열 크기-1)//인덱스 범위를 넘어가면 안됨(수식에러발생가능, 수식 쓸 때 주의하기!!), 인덱스를 벗어난 값은 접근할 수 없음!
  • 배열 전체를 대입하거나 비교 연산은 불가능 (요소별 처리 필요)

2. 배열의 초기화

기본 초기화 방법

int arr[5] = {1, 2, 3, 4, 5}; // 완전 초기화

부분 초기화

int amount[5] = {1, 1, 5}; // 1, 1, 5, 0, 0으로 초기화

전체 0으로 초기화

int price[5] = {0}; // 배열 전체를 0으로 초기화

배열 크기 생략

int arr[] = {1, 2, 3, 4, 5}; // 배열 크기는 5로 결정됨

3. 배열의 활용

배열 크기 구하기

int size = sizeof(arr) / sizeof(arr[0]);

배열과 반복문 활용

for(int i = 0; i < size; i++) {
    printf("%d ", arr[i]);
}

배열의 합계와 평균 계산

int sum = 0;
for(int i = 0; i < size; i++) {
    sum += arr[i];
}
double average = (double)sum / size;

4. 다차원 배열

2차원 배열 선언

int data[][];

2차원 배열 초기화

int data[3][2] = {
    {10, 20},
    {30, 40},
    {50, 60}
};

2차원 배열 사용

for(int i = 0; i < row; i++) {
    for(int j = 0; j < col; j++) {
        printf("%d ", data[i][j]);
    }
    printf("\n");
}

5. 함수와 배열

배열을 매개변수로 전달

void print_array(int arr[], int size) {
    for(int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

함수 호출

int data[3] = {10, 20, 30};
print_array(data, 3); // 배열 이름과 크기를 인자로 전달

6. 배열 탐색과 정렬

for(int i = 0; i < size; i++) {
    if(data[i] == key) {
        printf("찾은 원소의 인덱스: %d\n", i);
    }
}

선택 정렬(Selection Sort)

for(int i = 0; i < size - 1; i++) {
    int index_min = i;
    for(int j = i + 1; j < size; j++) {
        if(data[index_min] > data[j]) {
            index_min = j;
        }
    }
    if(i != index_min) {
        int temp = data[i];
        data[i] = data[index_min];
        data[index_min] = temp;
    }
}

c배열 연습문제

C 배열 연습 문제 (기말고사 대비)

기본 문제

문제 1: 배열 원소 중 홀수만 출력하기

크기가 10인 정수형 배열을 선언하고 초기화한 후, 배열 원소 중 홀수만 출력하는 프로그램을 작성하시오.

#include <stdio.h>

int main(void) {
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int i;

    printf("홀수인 원소: ");
    for(i = 0; i < 10; i++) {
        if(arr[i] % 2 == 1) {
            printf("%d ", arr[i]);
        }
    }
    printf("\n");

    return 0;
}

문제 2: 배열 원소 조건부 입력

크기가 10인 정수형 배열을 선언하고, 2번 배열원소까지만 값을 할당하고, 나머지는 0으로 초기화한다. 배열 원소값이 0인 경우에만 값을 할당받는 프로그램을 작성하시오.

#include <stdio.h>

int main(void) {
    int arr[10] = {1, 2, 3}; // 3번째 원소까지만 초기화, 나머지는 0
    int i, value;

    printf("초기 배열 상태: ");
    for(i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    for(i = 0; i < 10; i++) {
        if(arr[i] == 0) {
            printf("%d번 원소에 값 입력: ", i);
            scanf("%d", &value);
            arr[i] = value;
        }
    }

    printf("변경된 배열: ");
    for(i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

문제 3: 등차수열로 배열 채우기

크기가 10인 정수형 배열을 선언하고, 등차수열로 값을 채우려고 한다. 첫번째 항의 값과 공차를 입력받아서 배열원소 값을 채우고 출력하는 프로그램을 작성하시오.

#include <stdio.h>

int main(void) {
    int arr[10];
    int first, diff, i;

    printf("첫번째 항 입력: ");
    scanf("%d", &first);

    printf("공차 입력: ");
    scanf("%d", &diff);

    for(i = 0; i < 10; i++) {
        arr[i] = first + (i * diff);
    }

    printf("등차수열 배열: ");
    for(i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

문제 4: 최대값 찾기

주어진 배열 {15, 0, -20, -30, 50, -5, -120, -5, 10, -12}에서 가장 높은 값(최대값)을 찾아 출력하는 프로그램을 작성하시오.

#include <stdio.h>

int main(void) {
    int freeze[10] = {15, 0, -20, -30, 50, -5, -120, -5, 10, -12};
    int max, i;

    max = freeze[0]; // 첫번째 원소를 최대값으로 가정

    for(i = 1; i < 10; i++) {
        if(freeze[i] > max) {
            max = freeze[i];
        }
    }

    printf("가장 높은 어는 점: %d\n", max);

    return 0;
}

문제 5: 입력받은 점수의 평균 계산

정수형 배열에 점수를 입력받아 저장한 후, 입력된 점수와 점수 평균을 출력하는 프로그램을 작성하시오.

#include <stdio.h>

#define ST_SIZE 5

int main(void) {
    int score[ST_SIZE];
    int i, sum = 0;
    double average;

    printf("%d개의 점수를 입력하세요:\n", ST_SIZE);
    for(i = 0; i < ST_SIZE; i++) {
        printf("점수 %d: ", i+1);
        scanf("%d", &score[i]);
        sum += score[i];
    }

    average = (double)sum / ST_SIZE;

    printf("\n입력된 점수: ");
    for(i = 0; i < ST_SIZE; i++) {
        printf("%d ", score[i]);
    }
    printf("\n합계: %d\n", sum);
    printf("평균: %.2f\n", average);

    return 0;
}

심화 문제

문제 6: 대각 원소 출력

5*5 행렬의 원소를 1부터 25까지라고 할 때, 2차원 정수형 배열에 저장하고 행렬의 대각 원소만 출력하는 프로그램을 작성하시오.

#include <stdio.h>

#define ARR_SIZE 5

int main(void) {
    int matrix[ARR_SIZE][ARR_SIZE];
    int diagonal[ARR_SIZE]; // 대각 원소를 저장할 1차원 배열
    int i, j, num = 1;

    // 행렬에 1부터 25까지 저장
    for(i = 0; i < ARR_SIZE; i++) {
        for(j = 0; j < ARR_SIZE; j++) {
            matrix[i][j] = num++;
        }
    }

    // 행렬 출력
    printf("5*5 행렬:\n");
    for(i = 0; i < ARR_SIZE; i++) {
        for(j = 0; j < ARR_SIZE; j++) {
            printf("%3d ", matrix[i][j]);
        }
        printf("\n");
    }

    // 대각 원소 저장
    for(i = 0; i < ARR_SIZE; i++) {
        diagonal[i] = matrix[i][i];
    }

    // 대각 원소 출력
    printf("\n대각 원소: ");
    for(i = 0; i < ARR_SIZE; i++) {
        printf("%d ", diagonal[i]);
    }
    printf("\n");

    return 0;
}

문제 7: 학생 성적 처리

2차원 정수형 배열을 선언하고 초기화한 후, A반 학생 5명의 국어, 영어, 수학 성적을 2차원 배열에 입력받아 각 학생의 평균과 각 과목의 평균을 구하여 출력하는 프로그램을 작성하시오.

#include <stdio.h>

#define R_SIZE 5  // 학생 수
#define C_SIZE 3  // 과목 수

int main(void) {
    int scores[R_SIZE][C_SIZE];
    double student_avg[R_SIZE] = {0};  // 학생별 평균
    double subject_avg[C_SIZE] = {0};  // 과목별 평균
    int i, j, sum;
    char *subjects[C_SIZE] = {"국어", "영어", "수학"};

    printf("A반 %d명의 %d과목 성적을 입력하세요.\n", R_SIZE, C_SIZE);

    // 성적 입력
    for(i = 0; i < R_SIZE; i++) {
        printf("\n%d번 학생 성적 입력:\n", i+1);
        for(j = 0; j < C_SIZE; j++) {
            printf("%s 점수: ", subjects[j]);
            scanf("%d", &scores[i][j]);
        }
    }

    // 학생별 평균 계산
    for(i = 0; i < R_SIZE; i++) {
        sum = 0;
        for(j = 0; j < C_SIZE; j++) {
            sum += scores[i][j];
        }
        student_avg[i] = (double)sum / C_SIZE;
    }

    // 과목별 평균 계산
    for(j = 0; j < C_SIZE; j++) {
        sum = 0;
        for(i = 0; i < R_SIZE; i++) {
            sum += scores[i][j];
        }
        subject_avg[j] = (double)sum / R_SIZE;
    }

    // 결과 출력
    printf("\n[성적표]\n");
    printf("번호  ");
    for(j = 0; j < C_SIZE; j++) {
        printf("%s  ", subjects[j]);
    }
    printf("평균\n");
    printf("-----------------------------\n");

    for(i = 0; i < R_SIZE; i++) {
        printf("%d번   ", i+1);
        for(j = 0; j < C_SIZE; j++) {
            printf("%3d   ", scores[i][j]);
        }
        printf("%.2f\n", student_avg[i]);
    }

    printf("-----------------------------\n");
    printf("평균  ");
    for(j = 0; j < C_SIZE; j++) {
        printf("%.2f ", subject_avg[j]);
    }
    printf("\n");

    return 0;
}

문제 8: 배열 탐색 및 정렬 문제

정수형 배열을 사용자로부터 입력받아 값을 채운 후, 배열 내에서 특정 값을 찾고, 오름차순으로 정렬하는 프로그램을 작성하시오.

#include <stdio.h>

#define SIZE 5

void print_array(int arr[], int size) {
    int i;
    for(i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main(void) {
    int data[SIZE];
    int i, j, temp, key;
    int index_min;
    int found = 0;

    // 배열 값 입력
    printf("%d개의 정수를 입력하세요:\n", SIZE);
    for(i = 0; i < SIZE; i++) {
        printf("숫자 %d: ", i+1);
        scanf("%d", &data[i]);
    }

    // 배열 출력
    printf("\n입력된 배열: ");
    print_array(data, SIZE);

    // 탐색 기능
    printf("\n찾을 값을 입력하세요: ");
    scanf("%d", &key);

    for(i = 0; i < SIZE; i++) {
        if(data[i] == key) {
            printf("값 %d는 배열의 %d번 인덱스에 있습니다.\n", key, i);
            found = 1;
        }
    }

    if(!found) {
        printf("값 %d는 배열에 없습니다.\n", key);
    }

    // 선택 정렬(오름차순)
    for(i = 0; i < SIZE - 1; i++) {
        index_min = i;
        for(j = i + 1; j < SIZE; j++) {
            if(data[index_min] > data[j]) {
                index_min = j;
            }
        }
        if(i != index_min) {
            temp = data[i];
            data[i] = data[index_min];
            data[index_min] = temp;
        }

        printf("정렬 단계 %d: ", i+1);
        print_array(data, SIZE);
    }

    printf("\n정렬된 배열: ");
    print_array(data, SIZE);

    return 0;
}

문제 9: 2차원 배열 합치기

두 개의 2×3 행렬을 입력받아 합친 결과를 출력하는 프로그램을 작성하시오.

#include <stdio.h>

#define ROWS 2
#define COLS 3

int main(void) {
    int matrix1[ROWS][COLS];
    int matrix2[ROWS][COLS];
    int result[ROWS][COLS];
    int i, j;

    // 첫 번째 행렬 입력
    printf("첫 번째 %dx%d 행렬 입력:\n", ROWS, COLS);
    for(i = 0; i < ROWS; i++) {
        for(j = 0; j < COLS; j++) {
            printf("matrix1[%d][%d]: ", i, j);
            scanf("%d", &matrix1[i][j]);
        }
    }

    // 두 번째 행렬 입력
    printf("\n두 번째 %dx%d 행렬 입력:\n", ROWS, COLS);
    for(i = 0; i < ROWS; i++) {
        for(j = 0; j < COLS; j++) {
            printf("matrix2[%d][%d]: ", i, j);
            scanf("%d", &matrix2[i][j]);
        }
    }

    // 행렬 합치기
    for(i = 0; i < ROWS; i++) {
        for(j = 0; j < COLS; j++) {
            result[i][j] = matrix1[i][j] + matrix2[i][j];
        }
    }

    // 행렬 출력
    printf("\n첫 번째 행렬:\n");
    for(i = 0; i < ROWS; i++) {
        for(j = 0; j < COLS; j++) {
            printf("%3d ", matrix1[i][j]);
        }
        printf("\n");
    }

    printf("\n두 번째 행렬:\n");
    for(i = 0; i < ROWS; i++) {
        for(j = 0; j < COLS; j++) {
            printf("%3d ", matrix2[i][j]);
        }
        printf("\n");
    }

    printf("\n결과 행렬:\n");
    for(i = 0; i < ROWS; i++) {
        for(j = 0; j < COLS; j++) {
            printf("%3d ", result[i][j]);
        }
        printf("\n");
    }

    return 0;
}

문제 10: 배열을 활용한 히스토그램 출력

크기가 10인 정수형 배열에 0부터 9까지의 숫자를 무작위로 입력받아 저장한 후, 각 숫자의 출현 빈도를 히스토그램 형태로 출력하는 프로그램을 작성하시오.

#include <stdio.h>

#define SIZE 10

int main(void) {
    int numbers[SIZE];
    int frequency[SIZE] = {0}; // 빈도수 저장 배열 초기화
    int i, j;

    printf("%d개의 숫자(0-9)를 입력하세요:\n", SIZE);
    for(i = 0; i < SIZE; i++) {
        printf("숫자 %d: ", i+1);
        scanf("%d", &numbers[i]);

        // 입력 검증 (0-9 범위)
        while(numbers[i] < 0 || numbers[i] > 9) {
            printf("0부터 9까지의 숫자만 입력하세요.\n");
            printf("숫자 %d: ", i+1);
            scanf("%d", &numbers[i]);
        }

        // 빈도수 증가
        frequency[numbers[i]]++;
    }

    printf("\n입력된 숫자: ");
    for(i = 0; i < SIZE; i++) {
        printf("%d ", numbers[i]);
    }

    printf("\n\n[히스토그램]\n");
    for(i = 0; i < SIZE; i++) {
        printf("%d: ", i);
        for(j = 0; j < frequency[i]; j++) {
            printf("*");
        }
        printf(" (%d)\n", frequency[i]);
    }

    return 0;
}

7. 핵심 포인트 정리

배열 선언 시 주의점

  • 배열 크기는 상수로 지정 (변수 사용 불가)
  • 인덱스는 0부터 시작
  • 배열 이름은 배열의 시작 주소를 의미

배열 초기화 주의점

  • 초기값이 부족하면 나머지는 0으로 자동 초기화
  • 초기값이 배열 크기보다 많으면 컴파일 에러 발생
  • 빈 중괄호 {}는 컴파일 에러 발생

2차원 배열 주의점

  • int data[행][열] 형태로 선언
  • 행 크기는 생략 가능하지만 열 크기는 생략 불가
  • 메모리에는 열 인덱스가 먼저 증가하는 순서로 연속 할당됨

배열과 함수 사용 시 주의점

  • 함수 매개변수로 배열 선언 시 크기는 생략 (int arr[])
  • 배열의 크기는 별도 매개변수로 전달해야 함
  • 배열 전달 시 배열 이름만 사용 ([] 사용하지 않음)

0개의 댓글