Topic 2: 다차원 배열 📊
🎯 학습 목표
- 2차원 배열의 개념과 활용법을 이해할 수 있다
- 다차원 배열의 메모리 구조를 파악할 수 있다
- 실제 문제를 다차원 배열로 해결할 수 있다
🌟 다차원 배열의 세계
“1차원이 선이라면, 2차원은 면이고, 3차원은 공간이에요! 배열도 마찬가지죠!”
다차원 배열은 표(테이블), 행렬(Matrix), 게임 보드 같은 2차원 이상의 데이터를 다루는 강력한 도구입니다.
🏢 아파트 비유:
- 1차원 배열 → 한 층의 방들 (1호, 2호, 3호…)
- 2차원 배열 → 여러 층의 방들 (1층 1호, 2층 3호…)
- 3차원 배열 → 여러 동의 여러 층 (A동 3층 2호…)
📐 2차원 배열 기초
1. 선언과 초기화
#include <iostream>
using namespace std;
int main() {
// 2차원 배열 선언 방법들
// 방법 1: 크기 지정 후 나중에 값 할당
int matrix[3][4]; // 3행 4열 배열
// 방법 2: 선언과 동시에 초기화
int numbers[2][3] = {
{1, 2, 3}, // 첫 번째 행
{4, 5, 6} // 두 번째 행
};
// 방법 3: 한 줄로 초기화 (행 구분 없이)
int data[2][3] = {1, 2, 3, 4, 5, 6};
// 방법 4: 부분 초기화 (나머지는 0으로)
int partial[3][3] = {
{1, 2}, // {1, 2, 0}
{3}, // {3, 0, 0}
{} // {0, 0, 0}
};
// 값 할당
matrix[0][0] = 10; // 첫 번째 행, 첫 번째 열
matrix[1][2] = 25; // 두 번째 행, 세 번째 열
cout << "numbers[1][2] = " << numbers[1][2] << endl; // 6
cout << "matrix[0][0] = " << matrix[0][0] << endl; // 10
return 0;
}
2. 2차원 배열 순회하기
#include <iostream>
using namespace std;
int main() {
int grades[3][4] = {
{85, 92, 78, 95}, // 첫 번째 학생의 과목별 점수
{90, 87, 84, 91}, // 두 번째 학생
{76, 89, 93, 88} // 세 번째 학생
};
int rows = 3; // 행의 개수 (학생 수)
int cols = 4; // 열의 개수 (과목 수)
cout << "=== 학생별 성적표 ===" << endl;
// 방법 1: 이중 for 루프로 전체 출력
for (int i = 0; i < rows; i++) {
cout << "학생 " << (i + 1) << ": ";
for (int j = 0; j < cols; j++) {
cout << grades[i][j] << " ";
}
cout << endl;
}
cout << "\n=== 과목별 점수 ===" << endl;
// 방법 2: 열 우선 순회 (과목별로)
string subjects[] = {"국어", "영어", "수학", "과학"};
for (int j = 0; j < cols; j++) {
cout << subjects[j] << ": ";
for (int i = 0; i < rows; i++) {
cout << grades[i][j] << " ";
}
cout << endl;
}
return 0;
}
출력:
=== 학생별 성적표 ===
학생 1: 85 92 78 95
학생 2: 90 87 84 91
학생 3: 76 89 93 88
=== 과목별 점수 ===
국어: 85 90 76
영어: 92 87 89
수학: 78 84 93
과학: 95 91 88
💡 2차원 배열의 실제 활용 사례
왜 2차원 배열이 중요한가?
2차원 배열은 표 형태의 데이터를 다루는 모든 곳에서 사용됩니다:
🎯 게임 개발: 체스판, 바둑판, 지뢰찾기 게임판
📊 데이터 분석: 성적표, 매출 데이터, 설문조사 결과
🖼️ 이미지 처리: 픽셀 데이터, 필터 적용, 색상 변환
🗺️ 지리 정보: 지도 데이터, 높이 정보, 온도 분포
2차원 배열 접근 패턴 이해하기
int gameBoard[3][3]; // 3x3 게임 보드
// 패턴 1: 전체 순회
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
gameBoard[i][j] = 0; // 초기화
}
}
// 패턴 2: 대각선 접근
gameBoard[0][0] = 1; // 왼쪽 위
gameBoard[1][1] = 1; // 가운데
gameBoard[2][2] = 1; // 오른쪽 아래
연습: 간단한 패턴 만들기
#include <iostream>
using namespace std;
int main() {
int pattern[5][5];
// 여기에 코드를 작성하세요
// 힌트: 대각선에 1을, 나머지에는 0을 채워보세요
// 출력
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
cout << pattern[i][j] << " ";
}
cout << endl;
}
return 0;
}
📊 행렬 연산의 개념 이해
왜 행렬 연산이 중요한가?
**행렬(Matrix)**은 수학과 컴퓨터 과학에서 매우 중요한 개념입니다:
🧮 수학적 계산: 연립방정식 해결, 선형변환
🎮 게임 프로그래밍: 3D 회전, 이동, 확대/축소
🤖 인공지능: 신경망, 머신러닝 알고리즘
📊 데이터 처리: 이미지 변환, 신호 처리
기본 행렬 연산의 원리
1. 행렬 덧셈
A + B = [a11 + b11 a12 + b12]
[a21 + b21 a22 + b22]
규칙: 같은 위치의 원소끼리 더합니다.
2. 행렬 곱셈
A × B에서 결과[i][j] = A의 i번째 행과 B의 j번째 열의 내적
중요: A의 열 수 = B의 행 수여야 곱셈이 가능합니다!
3. 전치 행렬
A^T에서 A[i][j] = A^T[j][i]
의미: 행과 열을 바꿔놓은 것입니다.
행렬 연산 실습
#include <iostream>
using namespace std;
int main() {
int A[2][2] = {{1, 2}, {3, 4}};
int B[2][2] = {{5, 6}, {7, 8}};
int result[2][2];
// 행렬 덧셈 구현해보기
// 여기에 코드를 작성하세요
// 결과 출력
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
cout << result[i][j] << " ";
}
cout << endl;
}
return 0;
}
🤔 생각해보기
- 3×2 행렬과 2×4 행렬을 곱하면 결과는 몇 행 몇 열일까요?
- 대각 행렬이란 무엇이며 어떤 특징이 있을까요?
- 단위 행렬을 다른 행렬에 곱하면 어떻게 될까요?
🖼️ 2차원 배열의 실생활 응용
좌석 배치도 만들기
개념: 극장이나 교실의 좌석을 2차원 배열로 나타낼 수 있습니다.
- 0 = 빈 좌석
- 1 = 예약된 좌석
#include <iostream>
using namespace std;
int main() {
// 5행 6열 좌석 배치도
int seats[5][6] = {
{0, 1, 0, 0, 1, 0},
{1, 1, 0, 0, 0, 1},
{0, 0, 0, 1, 1, 0},
{1, 0, 0, 0, 0, 1},
{0, 1, 1, 0, 0, 0}
};
cout << "좌석 배치도 (0=빈좌석, 1=예약):" << endl;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 6; j++) {
cout << seats[i][j] << " ";
}
cout << endl;
}
return 0;
}
격자 게임 만들기
개념: 틱택토 같은 격자 게임을 2차원 배열로 구현할 수 있습니다.
#include <iostream>
using namespace std;
int main() {
// 3x3 게임판
char board[3][3] = {
{' ', ' ', ' '},
{' ', ' ', ' '},
{' ', ' ', ' '}
};
// 게임 상태 설정
board[0][0] = 'X';
board[1][1] = 'O';
board[2][2] = 'X';
// 게임판 출력
cout << "틱택토 게임판:" << endl;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cout << "[" << board[i][j] << "]";
}
cout << endl;
}
return 0;
}
🧊 3차원 배열의 개념과 활용
3차원 배열이란?
3차원 배열은 배열의 배열의 배열입니다!
int cube[깊이][높이][너비];
🧊 3차원 공간: x, y, z 좌표를 가진 공간 데이터
🎬 동영상: 시간별로 쌓인 이미지들 (프레임)
🧠 과학 계산: 온도, 압력 등의 3차원 분포
📚 학급 관리: 여러 학급 × 학생 × 과목별 성적
3차원 배열의 구조
cube[2][3][4]는 다음과 같은 구조입니다:
층 0: [1 2 3 4 ]
[5 6 7 8 ]
[9 10 11 12]
층 1: [13 14 15 16]
[17 18 19 20]
[21 22 23 24]
기본 사용법
#include <iostream>
using namespace std;
int main() {
// 3차원 배열 선언
int data[2][3][4];
// 초기화
int value = 1;
for (int i = 0; i < 2; i++) { // 깊이(층)
for (int j = 0; j < 3; j++) { // 높이(행)
for (int k = 0; k < 4; k++) { // 너비(열)
data[i][j][k] = value++;
}
}
}
// 특정 값 접근
cout << "data[1][2][3] = " << data[1][2][3] << endl;
return 0;
}
RGB 이미지와 3차원 배열
컬러 이미지 = 3차원 배열의 완벽한 예시입니다!
int image[HEIGHT][WIDTH][3]; // R, G, B 채널
// 빨간 픽셀 만들기
image[y][x][0] = 255; // Red = 최대값
image[y][x][1] = 0; // Green = 0
image[y][x][2] = 0; // Blue = 0
// 그레이스케일 변환 공식
int gray = 0.299 * R + 0.587 * G + 0.114 * B;
실습: 3차원 배열 연습
#include <iostream>
using namespace std;
int main() {
// 3학급 × 5명 × 3과목 성적표
int scores[3][5][3];
// 여기에 코드를 작성하세요
// 1. 모든 성적을 0으로 초기화
// 2. 1학급 1번 학생의 수학(과목2) 점수를 95점으로 설정
// 3. 해당 값을 출력해보세요
return 0;
}
🤔 메모리 이해하기
3차원 배열도 실제로는 1차원으로 저장됩니다:
cube[i][j][k] = *(cube + i×(높이×너비) + j×너비 + k)
이것이 배열의 본질입니다! 다차원은 인간이 이해하기 쉽게 만든 개념적 도구일 뿐입니다.
💭 생각해보기: 다차원 배열 퀴즈
Q1. 다음 2차원 배열에서 arr[2][1]
의 값은?
int arr[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
💡 정답 확인
정답: 8
2차원 배열에서 arr[2][1]
은:
arr[2]
: 3번째 행 9[1]
: 그 행의 2번째 요소 (0부터 시작)- 따라서 값은 8입니다.
Q2. 3×3 행렬에서 모든 대각선 요소의 합을 구하려면?
💡 정답 확인
정답:
int sum = 0;
// 주대각선 (왼쪽 위 → 오른쪽 아래)
for (int i = 0; i < 3; i++) {
sum += matrix[i][i];
}
// 부대각선 (오른쪽 위 → 왼쪽 아래)
for (int i = 0; i < 3; i++) {
sum += matrix[i][2-i];
}
// 중앙값 중복 제거 (3×3에서는 matrix[1][1])
sum -= matrix[1][1];
🏆 도전 과제: 간단한 패턴 만들기
1. 대각선 패턴 만들기
개념: 행과 열의 인덱스가 같은 곳에 1을 넣어보세요.
// 힌트: i == j인 경우에 1을 넣으세요
int pattern[3][3];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == j) {
pattern[i][j] = 1;
} else {
pattern[i][j] = 0;
}
}
}
2. 모든 행의 첫 번째 열에 1 넣기
개념: 첫 번째 열(j=0)에만 1을 넣어보세요.
결과:
1 0 0
1 0 0
1 0 0