목차
다차원 배열은 배열 요소를 다차원으로 가진다.
2차원 배열, 3차원 배열, 4차원 배열... , n차원 배열을 뜻한다.
그러나 다차원이 되면 메모리 공간이 급격하게 늘어나기에 주의하자.
1차원 배열
배열 요소들이 1차원적으로 배열되어 있다.
int s[10];
2차원 배열
배열 요소들이 2차원으로 배열되어 있다.
행과 열을 나타내는 2개의 인덱스를 가진다.
ex) 아파트 3층, 한 층에 5가구가 산다. ----> 3x5 크기의 2차원 배열
int s[3][2];
s[ i ][ j ] 는 배열 s의 i번째 행과 j번째 열의 요소이다.
2차원 배열의 초기화
선언과 동시에 초기화할 수 있다.
다만, 같은 행에 속하는 초기값들은 중괄호{}로 그룹핑을 해줘야 한다.
각 행의 초기값들은 쉼표로 구분한다.
// 초기화
int s[3][5] = {
{0,1,2,3,4},
{10, 11, 12, 13, 14},
{20, 21, 22, 23, 24}
};
만약 2차원 배열을 초기화할 때 가로 요소를 중괄호로 묶지 않아도 컴파일은 잘 된다.
하지만 직관적으로 어떤 구조인지 이해하기 어려워 잘 쓰지 않는다.
int s[3][5] = {0,1,2,3,4, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24};
연습문제
1. 2차원 배열 출력하기
- 배열 초기화 때, 가로 요소를 중괄호로 묶을 때
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
int main(void)
{
// 초기화
int i, j;
int s[3][5] = {
{0,1,2,3,4},
{10, 11, 12, 13, 14},
{20, 21, 22, 23, 24}
};
printf("{\n");
for (i = 0; i < 3; i++) {
printf("{");
for (j = 0; j < 5; j++) {
if (j==4) printf("%d", s[i][j]);
else printf("%d,", s[i][j]);
}
if (i == 2) printf("}\n");
else printf("},\n");
}
printf("}");
return 0;
}
- 배열 초기화 때 배열 요소를 일자로 늘어뜨릴 때
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
// 초기화
int i, j;
int s[3][5] = {0,1,2,3,4, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24};
printf("{\n");
for (i = 0; i < 3; i++) {
printf("{");
for (j = 0; j < 5; j++) {
if (j == 4) printf("%d", s[i][j]);
else printf("%d,", s[i][j]);
}
if (i == 2) printf("}\n");
else printf("},\n");
}
printf("}");
return 0;
}
2. 행렬 A+B의 덧셈
- 행렬(2차원 배열)처럼 보이게 하는 방법
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
int main(void)
{
// 초기화
int i, j;
int s[3][3] = { {1,0,0}, {0,1,0},{0,0,1} };
int k[3][3] = { {1,0,0}, {0,1,0}, {0,0,1} };
// 행렬 계산
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
printf("%d ", s[i][j]+s[i][j]);
}
printf("\n");
}
return 0;
}
- 새로운 행렬(2차원 배열)을 만드는 방법
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
#define ROWS 3
#define COLS 3
int main(void)
{
// 초기화
int r, c;
int s[ROWS][COLS] = { {1,0,0}, {0,1,0},{0,0,1} };
int k[ROWS][COLS] = { {1,0,0}, {0,1,0}, {0,0,1} };
int n[ROWS][COLS];
// 행렬 계산
for (r = 0; r < ROWS; r++) {
for (c = 0; c < COLS; c++) {
n[r][c] = s[r][c] + k[r][c];
printf("%d ", n[r][c]);
}
printf("\n");
}
return 0;
}
<주의점>
행렬 요소들의 인덱스로 사용될 변수 r, c를 선언했다.
영어로 행은 row, 열은 column 이기 때문에 2차원 배열의 사이즈나 인덱스를 정할 때 r,c를 사용하면 더욱 좋겠다.
3. 번갈아가면서 O, X를 3x3 보드 판에 채우는 게임
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
char board[3][3];
int x, y, k, i;
// 보드를 초기화한다.
for (x = 0; x < 3; x++)
for (y = 0; y < 3; y++) board[x][y] = ' ';
// 사용자로부터 위치를 받아서 보드에 표시한다.
for (k = 0; k < 9; k++) {
printf("(x, y) 좌표: ");
scanf("%d %d", &x, &y);
board[x][y] = (k % 2 == 0) ? 'X' : 'O'; // 현재의 순번에 따라 'X', 'O'중 선택
// 보드를 화면에 그린다.
for (i = 0; i < 3; i++) {
printf("---|---|---\n");
printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
}
printf("---|---|---\n");
}
return 0;
}
'C언어 > 참고서: C언어 콘서트' 카테고리의 다른 글
C언어 35차시 배열 연습문제 1 (0) | 2023.04.04 |
---|---|
C언어 34차시 배열 인덱스의 범위 넘어갈 때 발생하는 문제 (0) | 2023.03.29 |
C언어 32차시 정렬, 버블정렬, 오름차순, 내림차순, 버블정렬 도식화 (0) | 2023.03.29 |
C언어 31차시 배열 기초문제 1 (0) | 2023.03.28 |
C언어 30차시 배열의 초기화, sizeof 연산자 (0) | 2023.03.28 |