알고리즘

[알고리즘] 배열(자료구조1)

sundori 2023. 9. 11. 22:19

목차

    # 배열의 개념

    배열(Array)은 자료형이 같은 자료를 나열하여 메모리에 연속으로 저장하여 만든 자료 그룹이다.

    예를 들어 요일을 나타내는 월, 화, 수, 목, 금, 토, 일과 같이 각각 변수로 선언하면 변수를 7개나 만들어 개별적으로 사용해야 하지만 하나로 묶어 배열로 만들면 배열을 한 번만 선언해 만들 수 있고, 각 요일이 배열의 요소가 되어 다루기 편해진다.

    # 1차원 배열

    1차원 배열을 선언하는 형식은 밑과 같다.

    자료형 배열이름 [배열요소의 개수 = 인덱스(idx)];
    int array[10];

    Tip. 변수 이름을 정할 때 영문자, 숫자 밑줄을 사용하며 첫 글자는 숫자를 사용할 수 없고 알파벳 대문자와 소문자를 구분하며 키워드나 예약어는 사용할 수 없다.

    배열 선언의 예 의미 배열 요소 메모리 할당 크기
    char c[100]; char형 배열 요소
    100개로 구성된 배열 c
    c[0] ~ c[99] 1 byte * 100
    int i[100]; int형 배열 요소
    100개로 구성된 배열 i
    i[0] ~ i[99]  4 byte * 100
    short s[100]; short형 배열 요소
    100개로 구성된 배열 s
    s[0] ~ s[99] 2 byte * 100
    long l[100]; long형 배열 요소
    100개로 구성된 배열 l
    l[0] ~ l[99] 4 byte * 100
    #include <stdio.h>
    
    int main(int argc, char* argv[]){
        char c, char_array[100];
        int i, int_array[100];
        
        printf("\n char c 크기 = %d, char_array 크기 = %d", sizeof(c), sizeof(char_array));
        printf("\n int i 크기 = %d, int_array 크기 = %d\n", sizeof(i), sizeof(int_array));
        return 0;
    }
    -------------------------------------------------------
    char c 크기 = 1, char_array 크기 = 100
     int i 크기 = 4, int_array 크기 = 400
    Program ended with exit code: 0

    # 1차원 배열의 초기화

    자료형 배열이름[배열 크기] = {초깃값 리스트};
    int i[5] = {1, 2, 3, 4, 5}
    ----------------------------------
    #include <stdio.h>
    
    int main(int argc, char* argv[]){
        int i[3] = {1, 2, 3}, a[3];
        
        printf("i 배열의 원소 값 : %d, %d, %d\n", i[0], i[1], i[2]);
        printf("a 배열의 원소 값 : %d, %d, %d\n", a[0], a[1], a[2]);
        return 0;
    }
    --------------------------------------------
    i 배열의 원소 값 : 1, 2, 3
    a 배열의 원소 값 : 1, 1876947840, 1
    Program ended with exit code: 0

    # 문자 배열

    문자열이란 문자를 나열한 것을 의미한다. 문자 하나는 작은 따옴표('') 안에 'A'와 같이 표시하고, 문자열은 큰따옴표("") 안에 "ABCD"처럼 표시한다. C에서는 문자열을 저장하려면 문자열을 구성하는 문자를 연속해서 저장해야 하므로 배열을 사용한다.

    이때 배열의 문자 자료형은 (char)이 된다.

    // 문자열을 이용한 초기화
    char s[10] = "String";
    ..
    // 초깃값 문자 리스트를 사용한 초기화
    char s1[10] = {'S','t','r','i','n','g'};
    ..
    //
    C에서 문자 '0'과 문자 '\0'의 차이
    문자열을 표현할 때는 문자열의 끝을 의미하는 문자 하나를 마지막에 삽입한다.
    문자 '\0'을 문자열 끝을 나타내는데 사용하며, 이 문자를  널(null)문자라 하며, 아스키 코드 값 0에 해당한다. 그리고 symbol은 NUL이다(NULL과 다르다.)  문자 '0'은 아스키 코드 값 48이다. '\0'과는 반드시 구별해야한다.
    s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9]
    S t r i n g \0 크기 : 7바이트

    참고로 문자열의 끝을 나타내는 '\0'이 마지막에 추가되기 때문에 문자열을 저장할 크기는 실제 문자열 크기보다 1바이트가 더 커야 한다.

    char s[6] = "String"; // 안된다.
    char s[7] = "String"; // 가능하다.
    ....
    #include <stdio.h>
    
    int main(int argc, char* argv[]){
        char s[6] = "String";
        char s1[] = "String";
        printf("s배열의 길이 : %d", sizeof(s));
        printf("s1배열의 길이 : %d", sizeof(s1));
    }
    ---------------------
    s배열의 길이 : 6
    s1배열의 길이 : 7
    s1[0] s1[1] s1[2] s1[3] s1[4] s1[5] s1[6] s1[7] s1[8] s1[9]
    S t r i n g   크기 : 6바이트

    # 다차원 배열

    2차원 배열...

    // 2차원 배열 선언
    자료형 배열이름[배열크기][배열크기]
                행 개수   열 개수
                행 번호   열 번호
    int i[2][3];
    논리적 구조(i[2][3])
    i[0][0] i[0][1] i[0][2]
    i[1][0] i[1][1] i[1][2]
    물리적 구조
    1번지 i[0][0]
    2번지 i[0][1]
    3번지 i[0][2]
    4번지 i[1][0]
    5번지 i[1][1]
    6번지 i[1][2]

    3차원 배열...

    // 3차원 배열 선언
    자료형 배열이름[배열크기][배열크기][배열크기]
                면 개수   행 개수   열 개수
    int i[2][3][3];
    논리적 구조(i[0][3][3])
    i[0][0][0] i[0][0][1] i[0][0][2]
    i[0][1][0] i[0][1][1] i[0][1][2]
    i[0][2][0] i[0][2][1] i[0][2][2]

     

    논리적 구조(i[1][3][3])
    i[1][0][0] i[1][0][1] i[1][0][2]
    i[1][1][0] i[1][1][1] i[1][1][2]
    i[1][2][0] i[1][2][1] i[1][2][2]
    물리적 구조
    1번지 i[0][0][0]
    2번지 i[0][0][1]
    ...... ......
    16번지 i[1][2][0]
    17번지 i[1][2][0]
    18번지 i[1][2][2]

     

    다차원 배열의 초기화

    다차원 배열도 초깃값을 가질 수 있는데 초깃값을 지정하는 형태는 다차원 배열이 배열의 배열이라는 것을 생각하여 지정하거나 초깃값 리스트를 사용하여도 된다.

    // 2차원 배열 초기화
    int A[2][3] = {{1, 2, 3,}, {4, 5, 6}};
    또는
    int A[2][3] = {1, 2, 3, 4, 5, 6};
    ...
    // 2차원 배열 출력하기
    for(int i = 0; i < 2; i++)
            for(int j = 0; j < 3; j++)
                printf("%d ", A[i][j]);
    // 3차원 배열 초기화
    int A[2][3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, 
                      {10, 11, 12}, { 13, 14, 15}, {16, 17, 18}};
    또는
    int A[2][3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18};
    ...
    // 3 차원 배열 출력하기
    for(int i = 0; i < 2; i++)
            for(int j = 0; j < 3; j++)
                for(int k = 0; k < 3; k++)
                    printf("%d ", A[i][j][k]);