icon안동민 개발노트

다차원 배열


다차원 배열의 개념

 다차원 배열은 배열의 요소가 다시 배열인 구조를 말합니다. 가장 흔한 형태는 2차원 배열이며, 행렬(matrix)과 같은 데이터를 표현하는 데 사용됩니다. 3차원 이상의 배열도 가능하지만, 실제로는 2차원 배열이 가장 많이 사용됩니다.

2차원 배열의 선언과 초기화

 2차원 배열 선언

int matrix[3][4];  // 3행 4열의 정수형 2차원 배열

 이 선언은 3개의 행과 4개의 열을 가진 2차원 정수 배열을 생성합니다.

 2차원 배열 초기화

int matrix[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

 이 방식으로 2차원 배열을 선언과 동시에 초기화할 수 있습니다.

 부분 초기화

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

 초기화되지 않은 요소들은 자동으로 0으로 초기화됩니다.

2차원 배열 요소 접근

 2차원 배열의 요소에 접근할 때는 두 개의 인덱스를 사용합니다.

#include <iostream>
 
int main() {
    int matrix[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    
    int value = matrix[1][2];  // 2행 3열의 요소에 접근 (값: 7)
    std::cout << "matrix[1][2] = " << value << std::endl;
    
    matrix[0][3] = 100;  // 1행 4열의 요소 값 변경
    std::cout << "matrix[0][3] = " << matrix[0][3] << std::endl;
    
    return 0;
}

2차원 배열과 메모리

 2차원 배열은 실제로는 1차원 메모리에 연속적으로 저장됩니다.

 이를 이해하는 것은 배열의 효율적인 사용과 최적화에 중요합니다.

#include <iostream>
 
int main() {
    int matrix[3][4];
    std::cout << "배열의 크기: " << sizeof(matrix) << " bytes" << std::endl;
    std::cout << "첫 번째 요소의 주소: " << &matrix[0][0] << std::endl;
    std::cout << "두 번째 행의 첫 번째 요소 주소: " << &matrix[1][0] << std::endl;
    
    return 0;
}

 이 예제를 통해 2차원 배열이 메모리에 어떻게 저장되는지 확인할 수 있습니다.

2차원 배열과 반복문

 2차원 배열의 모든 요소에 접근하려면 중첩된 반복문을 사용합니다.

#include <iostream>
 
int main() {
    int matrix[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            std::cout << matrix[i][j] << " ";
        }
        std::cout << std::endl;
    }
    
    return 0;
}

범위 기반 for 루프와 2차원 배열 (C++ 11 이상)

 C++ 11부터는 범위 기반 for 루프를 사용하여 2차원 배열을 더 쉽게 순회할 수 있습니다.

#include <iostream>
 
int main() {
    int matrix[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    
    for (auto& row : matrix) {
        for (int elem : row) {
            std::cout << elem << " ";
        }
        std::cout << std::endl;
    }
    
    return 0;
}

다차원 배열

 C++에서는 2차원 이상의 다차원 배열도 선언할 수 있습니다.

int cube[2][3][4];  // 3차원 배열

 이는 2개의 3x4 2차원 배열을 가진 3차원 배열을 선언합니다.

다차원 배열의 매개변수 전달

 함수에 다차원 배열을 전달할 때는 첫 번째 차원을 제외한 나머지 차원의 크기를 명시해야 합니다.

#include <iostream>
 
void printMatrix(int matrix[][4], int rows) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < 4; j++) {
            std::cout << matrix[i][j] << " ";
        }
        std::cout << std::endl;
    }
}
 
int main() {
    int matrix[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    printMatrix(matrix, 3);
    return 0;
}

std::array와 다차원 배열

 C++ 11 이상에서는 std::array를 사용하여 다차원 배열을 더 안전하고 편리하게 다룰 수 있습니다.

#include <iostream>
#include <array>
 
int main() {
    std::array<std::array<int, 4>, 3> matrix = {{
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    }};
    
    for (const auto& row : matrix) {
        for (int elem : row) {
            std::cout << elem << " ";
        }
        std::cout << std::endl;
    }
    
    return 0;
}

동적 다차원 배열

 동적으로 크기가 결정되는 다차원 배열은 포인터의 배열 또는 벡터의 벡터를 사용하여 구현할 수 있습니다.

#include <iostream>
#include <vector>
 
int main() {
    int rows = 3, cols = 4;
    std::vector<std::vector<int>> matrix(rows, std::vector<int>(cols));
    
    // 행렬 초기화
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            matrix[i][j] = i * cols + j + 1;
        }
    }
    
    // 행렬 출력
    for (const auto& row : matrix) {
        for (int elem : row) {
            std::cout << elem << " ";
        }
        std::cout << std::endl;
    }
    
    return 0;
}

연습 문제

  1. 3x3 행렬을 입력받아 전치행렬(transpose)을 출력하는 프로그램을 작성하세요.
  2. 두 개의 2차원 배열(행렬)을 입력받아 행렬 곱셈을 수행하는 프로그램을 구현하세요.
  3. N x N 크기의 2차원 배열을 입력받아 시계 방향으로 90도 회전시키는 프로그램을 작성하세요.


참고 자료