C++

C++ 다차원 배열 총정리

김구티2 2024. 5. 26. 12:32

1. 다차원 배열의 개념

배열은 연속적인 메모리 위치에 보유된 동일한 데이터 유형의 항목의 컬렉션을 저장하는 데 사용되는 데이터 구조의 한 유형이다. 배열은 배열이 성장할 수 있는 방향의 수에 따라 1차원 또는 다차원일 수 있다. 여기서는 2차원 배열과  3차원 배열과 같은 다차원 배열을 깊게 학습하도록 한다.

 

구문:

datatype arrayName[size1][size2]...[sizeN];

 

예시:

Two dimensional array: int two_d[2][4];
Three dimensional array: int three_d[2][4][8];

2. 다차원 배열의 크기

배열의 크기는 데이터 유형의 크기에 배열에 저장할 수 있는 요소의 총 수를 곱한 것과 같다. 우리는 다차원 배열의 각 차원의 크기를 곱하여 배열의 총 요소 수를 계산할 수 있다.

 

이를 테면, int arr1[2][4];에서 배열은 2*4=8개의 요소를 저장할 수 있다. C++에서 데이터 유형은 4바이트가 소요되며, 여기서 8개의 요소가 있으므로, 총 크기는 4*8=32바이트가 된다.

 

마찬가지로, int arr2[2][4][8];에서는 2*4*8=64개의 요소가 저장될 수 있으며, 4바이트를 곱해서 총 크기는 256 바이트가 되는 것이다.

 

위 계산을 확인하기 위해 sizeof() 방법을 사용하여 배열의 크기를 얻을 수 있다.

 

예시:

// C++ program to verify the size of multidimensional 
// arrays 
#include <iostream> 
using namespace std; 

int main() 

     // creating 2d and 3d array 
     int arr1[2][4]; 
     int arr2[2][4][8]; 

     // using sizeof() operator to get the size of the above 
     // arrays 
     cout << "Size of array arr1: " << sizeof(arr1) 
             << " bytes" << endl; 
     cout << "Size of array arr2: " << sizeof(arr2) 
             << " bytes"

     return 0; 
}

 

출력:

Size of array arr1: 32 bytes
Size of array arr2: 256 bytes

3. 2차원(2D) 배열

C++의 2차원 배열은 행과 열로 구성된 요소의 집합이다. 표나 그리드로 시각화할 수 있으며, 각 요소는 행과 열의 두 가지 지수를 사용하여 액세스된다. 1차원 배열처럼, 2차원 배열 지수도 행과 열 모두에 대해 0에서 n-1까지 다양하다.

 

구문:

data_Type array_name[n][m];
* n은 행(row), m은 열(column)이다.

 

우리는 정적으로, 또한 동적으로 2D 배열을 선언할 수 있다. 정적인 선언에서 메모리는 컴파일 시간 동안 할당되고, 동적인 메모리는 런타임 동안 할당된다. 위는 2D 배열의 정적인 선언에 대한 구문이다. 2D 배열을 동적으로 선언하는 방법은 다음에 정리하도록 한다.

 

한편, 2D 어레이를 초기화하는 방법은 다음의 2가지가 있다.

 

① 이니셜라이저 리스트 사용

우리는 두 가지 방법으로 이니셜라이저 목록을 사용하여 2D 배열을 초기화할 수 있다.

⑴ 아래 배열은 2개의 행과 4개의 열이 있다. 첫 번째 행에 처음 4개의 원소가 채워지고 두 번째 행에 다음 4개의 원소가 채워지는 방식으로 원소가 채워진다.

int arr[2][4] = {0, 1, 2, 3, 4, 5, 6, 7};

⑵ 아래 방법은 2D 배열을 초기화하는 더 깔끔한 방법이다. 중첩된 목록은 행의 요소를 나타내고, 그 안의 요소의 수는 2D 배열의 열의 수와 같다. 중첩된 목록의 수는 열의 수를 나타낸다.

int x[2][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}};

 

② 루트 사용

루프를 사용하여 2D 배열을 초기화할 수도 있다. 2D 배열을 초기화하려면 두 개의 중첩 루프를 사용해야 하고, 중첩 루프는 차원과 같다. 예를 들어 3D 배열을 초기화하려면 세 개의 중첩 루프를 사용해야 한다.

 

예시: 아래 예시에서는 1로 2D 배열을 초기화한다. 바깥쪽 루프는 행을 추적하는 데 사용된다. "i=0"은 0 인덱스 때문에 첫 번째 행을 의미한다. "j=0"은 첫 번째 열을 의미하고, 이 x[0][0]을 결합하면 2D 배열의 첫 번째 셀을 나타낸다.

int x[2][4];
for(int i = 0; i < 2; i++){
    for(int j = 0; j < 4; j++){
        x[i][j] = 1;
    }
}

4. C++에서 2차원 배열 요소 접근

행 인덱스와 열 인덱스를 사용하여 2차원 배열의 요소에 접근할 수 있다. 행렬 요소 위치와 비슷하지만, 유일한 차이점은 여기서 인덱스가 0부터 시작한다는 것이다.

 

구문:

array_name[i][j];

* 여기서 i는 행의 인덱스, j는 열의 인덱스다.

 

예시:

// c++ program to illustrate the two dimensional array 
#include <iostream> 
using namespace std; 

int main() 


     int count = 1; 

     // Declaring 2D array 
     int array1[3][4]; 

     // Initialize 2D array using loop 
     for (int i = 0; i < 3; i++) { 
          for (int j = 0; j < 4; j++) { 
               array1[i][j] = count; 
               count++; 
         
    

     // Printing the element of 2D array 
     for (int i = 0; i < 3; i++) { 
          for (int j = 0; j < 4; j++) { 
               cout << array1[i][j] << " "
         
          cout << endl; 
    

     return 0; 
}

 

출력:

1 2 3 4 
5 6 7 8 
9 10 11 12 

 

위 코드에서 카운트를 1로 초기화한 후, 3행 4열의 2D 배열을 선언하고, 루프를 반복할 때마다 카운트 값과 증가 값으로 배열을 초기화했다. 그런 다음, 중첩 루프를 사용하여 2D 배열을 프린트하고 아래 출력에서 3행 4열이 있음을 알 수 있다.

5. 3차원(3D) 배열

3D 배열은 요소들을 3차원의 직육면체와 같은 구조로 저장하는 데이터 구조다. 그것은 여러 개의 2차원 배열들이 서로 겹쳐 쌓인 집합체로 시각화될 수 있다. 3D 배열의 각 요소는 행 인덱스, 열 인덱스, 깊이 인덱스의 세 가지 인덱스로 식별된다.

 

C++에서 3D 배열을선언하려면 2D 차원과 함께 3차원을 지정해야 한다.

 

구문:

dataType arrayName[d][r][c];

 

한편, C++에서 3D 배열을 초기화하기 위해서는 2D 배열을 초기화할 때 사용했던 것과 동일한 방법을 따른다. 3D 배열에서는 차원이 하나 더 있으므로 중첩된 요소 목록을 하나 더 추가해야 한다.

 

3D 어레이를 초기화하는 방법은 마찬가지로 2가지가 존재한다.

① 이니셜라이저 리스트 사용

⑴ 이 방법에서는 {} 안에 있는 전체 요소의 수를 적어야 하고, 주어진 치수에 따라 각 항목이 그 위치에 놓인다.

int x[3][5][2] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 
                  10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
                  20, 21, 22, 23, 24, 25, 26, 27, 28, 30};

⑵ 이 방법에서는 중첩된 목록을 사용하여 요소를 분할했으며, 따라서 읽기 수월하다.

int x[3][5][2] = { 
                     { {0, 1}, {2, 3}, {4, 5}, {6, 7}, {8, 9} }, 
                     { {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19} },
                     { {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 30} },
                 };

 

② 루프 사용

이 방법은 세 번째 차원에 대해 하나 이상의 중첩 루프가 있는 루프를 사용하여 2D 배열을 초기화하는 것과 같다.

int x[3][5][2];
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 5; j++) {
        for (int k = 0; k < 2; k++) {
            x[i][j][k] = (some_value);
        }
    }
}

6. C++에서 3차원 배열 요소 접근

3D 배열의 요소에 접근하는 것은 2D 배열의 요소에 접근하는 것만큼 간단하다. 여기서 우리가 추가적으로 해야 할 일은 그저 3차원을 추적하기 위해 중첩 루프를 하나 더 추가하는 것이다.

 

예시:

// C++ program to illustrate the 3d array 
#include <iostream> 
using namespace std; 

int main() 


      int count = 0; 
      // declaring 3d array 
      int x[2][2][3]; 

      // initializing the array 
      for (int i = 0; i < 2; i++) { 
            for (int j = 0; j < 2; j++) { 
                  for (int k = 0; k < 3; k++) { 
                        x[i][j][k] = count; 
                        count++; 
                  } 
            } 
      } 

      // printing the array 
      for (int i = 0; i < 2; i++) { 
            for (int j = 0; j < 2; j++) { 
                  for (int k = 0; k < 3; k++) { 
                        printf("x[%d][%d][%d] = %d \n", i, j, k, 
                                 x[i][j][k]); 
                        count++; 
                  } 
            } 
      } 

      return 0; 
}

 

출력:

x[0][0][0] = 0 
x[0][0][1] = 1 
x[0][0][2] = 2 
x[0][1][0] = 3 
x[0][1][1] = 4 
x[0][1][2] = 5 
x[1][0][0] = 6 
x[1][0][1] = 7 
x[1][0][2] = 8 
x[1][1][0] = 9 
x[1][1][1] = 10 
x[1][1][2] = 11 

 

위 코드에서 설명한 대로 카운트 변수를 사용하여 0에서 7까지의 숫자를 가진 루프를 사용하여 3D 배열을 초기화한 다음, 3D 배열을 초기화하는 데 사용된 것과 동일한 루프를 사용하여 요소에 액세스한다. 유일한 차이점은 특정 위치에 요소를 할당하는 대신, 아래 출력에서 볼 수 있듯이 해당 위치에 저장된 요소를 프린트한다는 것이다.

728x90