C 2주차 - 배열

Gunter·2024년 3월 7일
0

C

목록 보기
6/13

배열

 

배열이란?

자료형으로 많은 수의 변수를 선언하고 사용할 때는 나열식 표현에 한계가 있다. 그래서 C언어는 데이터를 그룹으로 묶어서 표현하는 '배열'(Array) 문법을 사용한다.

 



배열 선언하고 사용하기

배열은 자료형이 같은 변수들을 그룹으로 묶어서 관리할 때 사용

학생 20명의 성적을 저장하기 위해 위와 같이 배열을 선언.

 
배열을 선언하는 방법은 변수를 선언하는 방법과 비슷한데, [ ] 대괄호 기호를 사용하여 저장 공간을 몇 개 만들 것인지 명시해야 한다.
이 때 데이터를 저장할 요소 개수는 반드시 숫자 상수로 명시해야 한다.

위 배열의 메모리 구조는 다음과 같다.

student는 short형 변수 20개를 선언한 것과 같고, short형은 2바이트 이므로 student 변수는 총 40바이트 크기로 만들어진다.

 




배열의 특정 요소에 값 대입하기


배열에 값을 저장하려면 [ ] 기호를 사용해서 특정 요소의 위치를 명시해주어야 한다.

#include <stdio.h>
void main(){
	short student[20];
    
    studetn[1] = 10;
    printf("%d\n", student[1]);
}

 




배열 요소에 for문으로 값 대입하기

배열로 선언한 student 변수의 0번에서 4번 요소에 모두 5를 넣고 싶다면 아래와 같이 코드를 구성할 수 있다.

short student[20];
student[0] = 5;
student[1] = 5;
student[2] = 5;
student[3] = 5;
student[4] = 5;
short student[20], i;
for( i = 0 ; i < 5 ; i++ ) studetn[i] = 5;

 




배열 초기화하기

배열 문법은 지역 변수를 그룹으로 묶은 것이기 때문에 배열 문법으로 선언한 변수도 지역 변수처럼 자동으로 초기화되지 않는다.
그래서 배열의 각 요소에 일정한 값을 대입해 초기화해서 사용해야 한다.

만약 배열로 선언한 변수의 각 요소를 직접 초기화하지 않을 경우,

#include <stdio.h>
void main(){
	short student[20];
    
    student[1] = 10;
    
    printf("%d %d", student[1], student[2]);
}
10 -13108

위와 같이 student[2] 값은 이상한 숫자가 출력된다.

일반적으로 프로그래머들은 초깃값으로 0을 사용한다.

#include <stdio.h>
void main(){
	short student[20], i;
    for( i = 0 ; i < 20 ; i++) student[i] = 0;
    
    student[1] = 10;
    
    printf("%d %d", student[1], student[2]);
}

위와 같이 student 배열의 모든 요소를 0으로 초기화 해주어야 한다.

 




쉼표를 사용한 배열 초기화 문법

배열을 초기화 하는 데 매번 반복문을 사용하기 불편하니, 배열을 선언한 변수도 일반 변수처럼 초기화 하는 방법이 있다.

short student[20] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

 
이 초기화 방법은 배열의 요소가 많아지면 부담스러워 지기 때문에 아래와 같이 쓸 수도 있다.

short student [20] = {0,};

 

#include <stdio.h>
void main(){
	short student[20] = {0,};
    
    student[1] = 10;
    
    printf("%d %d", student[1], student[2]);
}

 

* 주의할 점

short data[5] = {3,} 은 {3, 0, 0, 0, 0}과 같다.

 


 


2차원 배열

바둑판에 놓인 돌의 좌표를 표현하고 싶다면 어떻게 해야 할까?

각 배열의 요소에 돌이 놓여있지 않느면 0, 검은돌이 놓여 있으면 1, 흰 돌이 놓여 있으면 2라고 저장하고 바둑판에 놓여 있는 돌의 정보를 저장하기 위해 1차원 배열을 선언해본다.

char data[361];

바둑판 정보는 가로와 세로가 있는 2차원 형태이기 때문에 1차원 배열에 저장하면 소스코드를 작성할 때 요소의 위치를 파악하기 어렵다.

 


2차원 배열의 필요성

차원은 공간에서 좌표를 구성하는 축의 개수를 의미.
2차원은 좌표를 적을 때 2개의 축을 사용한다. (X축, Y축)

좀 더 구체적으로 설명하기 위해 앞에서 말한 19x19 바둑판을 5x4 바둑판으로 바꾸고 몇 개의 바둑돌을 놓아 보자.

위 바둑판엔 최대 20개의 돌을 놓을 수 있는 지점이 있고, 0, 1, 2 라는 상황이 있다.
(각 배열의 요소에 돌이 놓여있지 않느면 0, 검은돌이 놓여 있으면 1, 흰 돌이 놓여 있으면 2라고 저장)

세 가지 상황 중 한가지를 저장하려면 char형이면 충분하다.
다음과 같이 변수를 선언하면 20바이트의 메모리를 사용할 수 있기에 위 바둑판의 상태를 모두 저장할 수 있다.

char data[20];

하지만 이렇게 2차원 형식의 데이터를 1차원 배열로 관리하면 data[7]에 저장된 돌의 상태가 바둑판에서 몇 행, 몇 열인지 판단하기 어렵다.

따라서 이런 경우에는 2차원 데이터와 표현 방식이 같은 2차원 배열을 사용해야 한다.

 




2차원 배열 선언하기

다음처럼 같은 형식의 1차원 배열 5개를 묶어보자.

char data1[4], data2[4], data3[4], data4[4], data5[4]

 

5개의 1차원 배열은 모두 char[4]형식으로 같기 때문에,

char data[5][4]; 

와 같이 묶을 수 있다.

data 변수의 2번째 행, 3번째 열에 10이라는 값을 넣으려면 아래와 같이 적으면 된다.

data[1][2] = 10;

 




2차원 배열 초기화하기

char temp1[3] = {1, 2, 3};
char temp2[3] = {4, 5, 6};

위와 같이 선언한 두개의 1차원 배열을 아래와 같이 하나의 2차원 배열로 변경할 수 있다.

char temp[2][3];

2차원 배열을 이용하여 temp변수를 선언했으니 초기화도 해 준다.
2차원 배열은 그룹 안에 또 다른 그룹이 있는 형태이기 때문에 { }를 중복으로 사용해야 한다.

 

char temp[2][3] = {{1, 2, 3}, {4, 5, 6}};

 




1차원 배열과 2차원 배열의 차이 (바둑판 정보 저장하기)

1차원 배열
3x4 바둑판 형태로 축소시켜 놓고 돌이 놓여있는 상황을 1차원 배열로 표현

#include <stdio.h>

void main(){
	char data[12] = {0, 0, 2, 0, 1, 1, 0, 0, 2, 1, 0, 2}
    int i, x, y;
    
    for(i = 0 ; i < 12 ; i++){
    	x = i % 4 + 1; /* 열 번호 */
        y = i / 4 + 1; /* 행 번호 */
        printf("%d행 %d열에", y, x);
        if (data[i] == 1) printf(" 검은 돌이 놓여 있습니다.\n");
        elsf if (data[i] == 2) printf(" 흰 돌이 놓여 있습니다. \n");
        else printf("는 돌이 놓여 있지 않습니다.");
        }
    }

 


2차원 배열

#include <stdio.h>

void main(){
	char data[3][4] = {{0, 0, 2, 0}, {1, 1, 0, 0}, {2, 1, 0, 2}};
    int x, y;
    
    for(y = 0 ; y < 3 ; y++){
    	for(x = 0 ; x < 4 ; x++){
        	printf("%d행 %d열에", y+1, x+1);
            if (data[y][x] == 1) printf(" 검은 돌이 놓여 있습니다.\n");
            else if (data[y][x] == 2) printf(" 흰 돌이 놓여 있습니다.\n");
            else printf("는 돌이 놓여 있지 않습니다.\n");
            }
        }
    }

 


n차원 배열 ( n > 2 )

 

삼차원 배열 : 이차원 배열 여러개가 모여서 이루는 배열.(도형에서의)입체_면들이 모여서 생김

사차원 배열 :삼차원 배열 여러개가 모여서 이루는 배열. 시공간_공간에 시간개념이 추가됨.

출처: https://sunrinnote.tistory.com/13 [chongin12:티스토리]

 





🔥 도전해보기

🔥 다음과 같은 내용을 도전해봅시다.

  1. 랜덤한 값을 가지는 10개의 배열 만들기
  2. 해당 배열의 최댓값 출력하기
  3. 해당 배열의 최솟값 출력하기
  4. 해당 배열을 오름차순으로 정렬하기
  5. 해당 배열을 내림차순으로 정렬하기

 

  1. 랜덤한 값을 가지는 10개의 배열 만들기
#include <stdio.h>

int main() {
    int byl[10] = {2, 4, 8, 12, 48, 44, 48, 50, 80, 92};

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

    return 0;
}


 
2. 해당 배열의 최댓값 출력하기

#include <stdio.h>

int main() {
    int byl[10] = {2, 4, 8, 12, 48, 44, 48, 50, 80, 92};

    /* 초기에 최댓값을 배열의 첫 번째 요소로 설정 */
    int max_value = byl[0];

    /* 배열을 순회하면서 최댓값 갱신 */
    for (int i = 1; i < 10; i++) {
        if (byl[i] > max_value) {
            max_value = byl[i];
        }
    }

    printf("최댓값: %d\n", max_value);

    return 0;
}

 

 
3. 해당 배열의 최솟값 출력하기

#include <stdio.h>

int main() {
    int byl[10] = {2, 4, 8, 12, 48, 44, 48, 50, 80, 92};

    /* 초기에 최솟값을 배열의 첫 번째 요소로 설정 8?
    int min_value = byl[0];

    /* 배열을 순회하면서 최솟값 갱신 */
    for (int i = 1; i < 10; i++) {
        if (byl[i] < min_value) {
            min_value = byl[i];
        }
    }

 
    printf("최솟값: %d\n", min_value);

    return 0;
}

 

 
4. 해당 배열을 오름차순으로 정리하기

#include <stdio.h>

int main() {
    int byl[10] = {2, 4, 8, 12, 48, 44, 48, 50, 80, 92};


    for (int i = 0; i < 10 - 1; i++) {
        for (int j = 0; j < 10 - i - 1; j++) {
            
            if (byl[j] > byl[j + 1]) {

                int temp = byl[j];
                byl[j] = byl[j + 1];
                byl[j + 1] = temp;
            }
        }
    }


    printf("오름차순 배열: ");
    for (int i = 0; i < 10; i++) {
        printf("%d ", byl[i]);
    }

    return 0;
}

 

 
4. 해당 배열을 내림차순으로 정리하기

#include <stdio.h>

int main() {
    int byl[10] = {2, 4, 8, 12, 48, 44, 48, 50, 80, 92};

    for (int i = 0; i < 10 - 1; i++) {
        for (int j = 0; j < 10 - i - 1; j++) {

            if (byl[j] < byl[j + 1]) {  /* 부등호 방향 변경 */
                int temp = byl[j];
                byl[j] = byl[j + 1];
                byl[j + 1] = temp;
            }
        }
    }


    printf("내림차순 배열: ");
    for (int i = 0; i < 10; i++) {
        printf("%d ", byl[i]);
    }

    return 0;
}

0개의 댓글