C 언어(15) - 다차원 배열

C 언어 강의, 다차원 배열

Featured image

🔚 짧게 하는 복습

✅ 1. 배열의 선언, 초기화, 원소 접근을 안다.

✅ 2. 상수의 종류와 쓰임을 안다.

✅ 3. 어떠한 상수들이 배열 선언 시 원소 개수로 사용될 수 있는지 알자.

혹시 기억이 안 난다면, 다시 돌아가자


저번 시간은 배열에 대해 다루었다.

기본적으로 자료형만 다루던 이전 강의들과는 다르게, 배열에 도입된 후부터는 훨씬 현실적인 문제를 해결하게 된다.

왜냐하면, 데이터 하나, 두 개를 다루는 일보다는 수백 개, 수천 개를 다룰 일이 현실에 훨씬 많기 때문이다.

하지만 아직 우리는 현실의 문제를 풀기에는 많이 부족하다.

왜냐하면, 실생활과 관련된 문제들은 보통 차원이 1차원의 데이터가 아니다.

쉽게 예를 들자면,

광학에서 쓰이는 문제를 해결하기 위한 시스템(여러분이 익히 아는 연립방정식과 비슷함)이다.

여기서 변수만 6개, 2 x 2 행렬을 통해서 시스템의 해를 구하는 것인데, 우리가 아는 배열로는 아직은 무리가 있다.

그래서 우리는 2차원의 배열, 혹은 그 이상의 다차원 배열에 관해 이야기를 하겠다.


2차원 배열

2차원 배열은 배열 안에 배열을 포함하는 구조로, 선언과 초기화 모두 직관적으로 1차원의 것에서 확장할 수 있다.

(자료형) (배열 이름)[배열  크기][배열  크기];

(자료형) (배열 이름)[배열  크기][배열  크기] = {{원소 1, 원소2, 원소3 ...}, {원소 n, 원소 n+1, 원소 n+2 ...}};

인 형태이다. 특이한 점이라면 배열 이름 옆에 []가 하나 더 붙었고, 앞에는 행, 열의 개수가 각각의 []에 들어가게 된다.

추가로 아래에 열거된 형태들도 모두 같은 초기화에 해당된다.

int score[2][3];
int score[2][3] = {{1,2,3}, {4,5,6}};

int score[2][3] = {1,2,3,4,5,6}; //3번 라인
int score[][3] = {{1,2,3}, {4,5,6}};

int score[2][3] = {0, }; // 5번 라인 {0, 0, 0, 0, 0, 0}으로 초기화
int score[2][3] = {1, 2, }; // 6번 라인 {1, 2, 0, 0, 0, 0}으로 초기화

다만 5번째나 6번째 같은 경우 절대 행의 개수를 생략할 수 없다.(어디가 끝인지 모르니까)

각 원소에 접근하는 방법은 [행 인덱스][열 인덱스]로 접근할 수 있다.

실제 코드를 보며 이해하자.

역시나 1차원 배열로부터 개념을 확장하는데 어렵지 않다.

2차원 배열을 for 문으로 연결해서 접근하려면 중첩된 for 문, 이중 for 문을 써야 한다.

나머지는 과제와 더 공부해보기에서 연습해보자.

3차원 배열

아마도 여러분이 공부하면서 볼 마지노선이 3차원 배열일 것이다.

4차원 이상의 다차원 배열은 사실 잘 쓰이지도 않기 때문이다.

내용도 거의 같고 개념의 확장을 하면 된다.


📖 오늘의 핵심(다 알기 전까지는 넘어가지 말자❗)

✅ 1. 2차원 배열의 선언, 초기화, 탐색을 안다.

✅ 2. 3차원 배열의 선언, 초기화, 탐색을 안다.

✅ 3. 다차원 배열에 대해서 선언, 초기화, 탐색을 일반화할 수 있다.

💣 과제,

  1. 5 x 5 행렬 2개를 입력받고 덧셈을 해보자. (난이도 下)

  1. 5 x 5 행렬 2개를 입력받고 곱셈을 해보자. (난이도 中)

  1. 5 x 5 행렬 1개를 입력받고 transpose를 해보자. (난이도 中) (transpose가 뭔지 모르겠으면 검색해보자)

🔜 더 공부해보기,

백준(BOJ) 2566번 - 최댓값

정답 보기
#include<stdio.h>

int main(){
    int arr[9][9] = {0,};

    for(int i= 0; i<9; i++){
        for(int j= 0; j<9; j++){
            scanf("%d", &arr[i][j]);
        }
    }
    int max = -1;
    int pos_x, pos_y;

    for(int i= 0; i<9; i++){
        for(int j= 0; j<9; j++){
            if(max < arr[i][j]){
                max = arr[i][j];
                pos_x = i;
                pos_y = j;
            }
        }
    }
    printf("%d\n%d %d", max, pos_x+1, pos_y+1);

    return 0;
}

백준(BOJ) 2563번 - 색종이 (1차원 배열의 백준(BOJ) 5597번 - 과제 안 내신 분..?과 비슷)

정답 보기
#include<stdio.h>

int main(){
    int arr[100][100] = {0,};

    int n;
    scanf("%d", &n);

    for(int k = 0; k<n; k++){
        int x, y;
        scanf("%d %d", &x, &y);

        for(int i= 0; i<10; i++){
            for(int j= 0; j<10; j++){
                arr[y+i][x+j] += 1;
            }
        }
    }

    int count =0;

    for(int i= 0; i<100; i++){
        for(int j= 0; j<100; j++){
            if(arr[i][j] != 0){
                count+=1;
            }
        }
    }

    printf("%d", count);

    return 0;
}