Skip to Content
💻 코리아IT아카데미 신촌 - 프로그래밍 학습 자료

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; }

🤔 생각해보기

  1. 3×2 행렬2×4 행렬을 곱하면 결과는 몇 행 몇 열일까요?
  2. 대각 행렬이란 무엇이며 어떤 특징이 있을까요?
  3. 단위 행렬을 다른 행렬에 곱하면 어떻게 될까요?

🖼️ 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
Last updated on