본문 바로가기
C언어

C언어 기초 part 2-2. 다차원 배열

by algosketch 2020. 1. 31.
  • 2차원 배열
  • 다차원 배열

 

1. 2차원 배열

 2차원 배열은 배열의 확장이다. 기존의 1차원 배열이 x축만 있는 구조였다면 2차원 배열은 x, y축까지 갖는다고 보면 된다. 필자는 2차원 배열을 행렬로 생각하고 프로그래밍 한다. 즉, 논리만 맞으면 편한대로 생각해도 된다. 프로그램 상으로 4차원, 5차원 배열도 구현이 가능한데 5차원 배열을 표나 그림으로 나타낼 수는 없지 않은가?

 구조는 1차원 배열과 동일하다. 메모리상에 연속적으로 할당된다. 선언 방법도 예상하다시피 int table[5][5]; 와 같이 선언한다. 필자는 이 배열은 table[행][열]로 해석한다. 메모리상에서 2차원 배열은 1행의 배열이 모두 할당되고 연속으로 2행의 배열이 할당되는 식이다. 즉, 메모리상에서 다음과 같이 정렬된다. table[0][0], table[0][1], table[0][2], table[0][3], table[0][4], table[1][0], ...

  국어 영어 수학 합계
학생1 80 90 95  
학생2 70 80 85  
학생3 85 100 80  

 위와 같이 점수가 주어져 있는 표의 마지막 열에 들어갈 숫자를 구하는 코드를 작성해보자.

int sumScore[3]; // 인원수
int table[3][3] = { // 인원수, 과목수
    {80, 90, 95},
    {70, 80, 85},
    {85, 100, 80}
};

for(int student = 0; student < 3; ++student) {
    for(int subject = 0; subject < 3; ++subject) {
        sumScore[student] += table[student][subject];
    }
}
for(int student = 0; student < 3; ++student) {
    printf("학생%d: %d\n", student+1, sumScore[student]);
}

 선언과 동시에 초기화 하는 방법도 코드에 나타냈다. 1차원 배열 때처럼 데이터 일부를 생략하고 초기화 하는 것도 가능하다. 논리만 2차원이고 실제로는 1차원 배열과 다를 게 없기 때문에 다음과 같이 초기화 해도 같은 결과를 보인다.

int table[3][3] = {80, 90, 95, 70, 80, 85, 85, 100, 80};

 다음과 같이 데이터를 생략해도 컴파일 에러가 발생하지 않는다.

int table[3][3] = {1, 2, 3, 4, };
/* 다음과 같이 초기화
1 2 3
4 0 0
0 0 0
*/

 

2. 다차원 배열

 대괄호 '[', ']'의 개수가 배열 차원의 수다. 3차원 이상의 배열을 선언할 때에도 arr[3][6][9]; 와 같이 선언하면 된다. 1차원에서 2차원으로 확장될 때처럼 3차원 이상도 같은 맥락으로 생각하면 된다. 내가 테트리스를 만들 때 테트리스 블록에 대한 데이터를 배열을 이용하여 나타냈는데, 그때 사용한 게 4차원 배열이다. 구조는 block[종류][회전][-y좌표][x좌표] 였다. 여기서 x, y좌표가 마지막에 온다는 건 큰 의문이 없겠지만 회전과 종류의 위치를 바꾸어 block[회전][종류][-y좌표][x좌표] 와 같이 표현해도 자연스럽게 보일 것이다. x와 y좌표 또한 표현하기 나름이고 논리만 맞다면 위치를 바꿔도 상관 없다.

// 실제 테트리스 코드의 일부
// https://github.com/HamBP/TetrisCpp

int block[7][4][4][4] =
	{
/*
	■■
	■■
*/
		{	{	{ 0, 0, 0, 0 },
				{ 0, 1, 1, 0 },
				{ 0, 1, 1, 0 },
				{ 0, 0, 0, 0 }
			},
			{	{ 0, 0, 0, 0 },
				{ 0, 1, 1, 0 },
				{ 0, 1, 1, 0 },
				{ 0, 0, 0, 0 }
			},
			{	{ 0, 0, 0, 0 },
				{ 0, 1, 1, 0 },
				{ 0, 1, 1, 0 },
				{ 0, 0, 0, 0 }
			},
			{	{ 0, 0, 0, 0 },
				{ 0, 1, 1, 0 },
				{ 0, 1, 1, 0 },
				{ 0, 0, 0, 0 }
			}
		},
/*
	■■■■
*/
		{	{	{ 0, 0, 0, 0 },
				{ 0, 0, 0, 0 },
				{ 1, 1, 1, 1 },
				{ 0, 0, 0, 0 }
			},
			{	{ 0, 1, 0, 0 },
				{ 0, 1, 0, 0 },
				{ 0, 1, 0, 0 },
				{ 0, 1, 0, 0 }
			},
			{	{ 0, 0, 0, 0 },
				{ 1, 1, 1, 1 },		
				{ 0, 0, 0, 0 },
				{ 0, 0, 0, 0 }
			},
			{	{ 0, 0, 1, 0 },
				{ 0, 0, 1, 0 },
				{ 0, 0, 1, 0 },
				{ 0, 0, 1, 0 }
			}
		},
/*
	  ■
	■■■
*/
		{	{	{ 0, 0, 0, 0 },
				{ 0, 1, 0, 0 },
				{ 1, 1, 1, 0 },
				{ 0, 0, 0, 0 }
			},
			{	{ 0, 0, 0, 0 },
				{ 0, 1, 0, 0 },
				{ 0, 1, 1, 0 },
				{ 0, 1, 0, 0 }
			},
			{	{ 0, 0, 0, 0 },
				{ 0, 0, 0, 0 },
				{ 1, 1, 1, 0 },
				{ 0, 1, 0, 0 }
			},
			{	{ 0, 0, 0, 0 },
				{ 0, 1, 0, 0 },
				{ 1, 1, 0, 0 },
				{ 0, 1, 0, 0 }
			}
		},
/*
	■
	■■■
*/
		{	{	{ 0, 0, 0, 0 },
				{ 0, 1, 0, 0 },
				{ 0, 1, 1, 1 },
				{ 0, 0, 0, 0 }
			},
			{	{ 0, 0, 0, 0 },
				{ 0, 1, 1, 0 },
				{ 0, 1, 0, 0 },
				{ 0, 1, 0, 0 }
		},
			{	{ 0, 0, 0, 0 },
				{ 1, 1, 1, 0 },
				{ 0, 0, 1, 0 },
				{ 0, 0, 0, 0 }
		},
			{	{ 0, 0, 1, 0 },
				{ 0, 0, 1, 0 },
				{ 0, 1, 1, 0 },
				{ 0, 0, 0, 0 }
			}
		},
/*
		■
	■■■
*/
		{	{	{ 0, 0, 0, 0 },
				{ 0, 0, 1, 0 },
				{ 1, 1, 1, 0 },
				{ 0, 0, 0, 0 }
			},
			{	{ 0, 1, 0, 0 },
				{ 0, 1, 0, 0 },
				{ 0, 1, 1, 0 },
				{ 0, 0, 0, 0 }
			},
			{	{ 0, 0, 0, 0 },
				{ 0, 1, 1, 1 },
				{ 0, 1, 0, 0 },
				{ 0, 0, 0, 0 }
			},
			{	{ 0, 0, 0, 0 },
				{ 0, 1, 1, 0 },
				{ 0, 0, 1, 0 },
				{ 0, 0, 1, 0 }
			}
		},
/*
	■■
	  ■■
*/
		{	{	{ 0, 0, 0, 0 },
				{ 1, 1, 0, 0 },
				{ 0, 1, 1, 0 },
				{ 0, 0, 0, 0 }
		},
			{	{ 0, 0, 1, 0 },
				{ 0, 1, 1, 0 },
				{ 0, 1, 0, 0 },
				{ 0, 0, 0, 0 }
		},
			{	{ 0, 0, 0, 0 },
				{ 0, 1, 1, 0 },
				{ 0, 0, 1, 1 },
				{ 0, 0, 0, 0 }
			},
			{	{ 0, 0, 0, 0 },
				{ 0, 0, 1, 0 },
				{ 0, 1, 1, 0 },
				{ 0, 1, 0, 0 }
			}
		},
/*
	  ■■
	■■
*/
		{	{	{ 0, 0, 0, 0 },
				{ 0, 0, 1, 1 },
				{ 0, 1, 1, 0 },
				{ 0, 0, 0, 0 }
			},
			{	{ 0, 0, 0, 0 },
				{ 0, 1, 0, 0 },
				{ 0, 1, 1, 0 },
				{ 0, 0, 1, 0 }
			},
			{	{ 0, 0, 0, 0 },
				{ 0, 1, 1, 0 },
				{ 1, 1, 0, 0 },
				{ 0, 0, 0, 0 }
			},
			{	{ 0, 1, 0, 0 },
				{ 0, 1, 1, 0 },
				{ 0, 0, 1, 0 },
				{ 0, 0, 0, 0 }
			}
		}
	};