본문 바로가기

Learn & Develop/C

C언어 - 다차원 배열(1차원 배열, 2차원 배열, 3차원 배열)

배열

 일반적인 변수와는 달리 여러 개의 데이터를 저장할 수 있는 것. 쉽게 표현하자면, '둘 이상의 변수를 모아 놓은 것'이다.

 기본적인 형태는 '<배열의 자료형> <배열의 이름> <배열의 길이>' 이다.

 

 배열은 초기값을 먼저 선언할 수 있고, 나중에 선언할 수도 있다.

 배열의 위치 정보를 명시하는 인덱스 값은 1이 아닌 0번부터 시작한다.

#include <stdio.h>
int main(void) {
    //배열의 값을 먼저 선언한 경우.
    int arrA[5] = { 1, 2, 3, 4, 5 };
    
    //배열의 값을 나중에 선언한 경우.
    int arrB[5];
    arrB[0] = 1; //인덱스 값이 0부터 시작함.
    arrB[1] = 2;
    arrB[2] = 3;
    arrB[3] = 4;
    arrB[4] = 5;
    
    return 0;
}

1차원 배열

<배열의 자료형> <배열의 이름>[<배열의 칸 수>];

 1차원 배열은 '지하철'이라고 생각하면 편하다.

 

 

 ex) 초기값이 1, 2, 3, 4 인 int형 4칸 배열 arr.

int arr[4] = { 1, 2, 3, 4 };

 

 

 'int형 배열 arr' 이라는 열차는 4개의 좌석을 가졌고, 승객 1, 2, 3, 4가 탑승했다.

<int형 배열 arr> <4칸> 1 <[0]> 2 <[1]> 3 <[2]> 4 <[3]>

 

 하지만 3이 중간에 내려버렸다.

int arr[4] = { 1, 2, 4 };

 

승객이 없으니 그 자리는 0이 되었다.

<int형 배열 4칸> <arr> 1 <[0]> 2 <[1]> 4 <[2]> 0 <[3]>

 

 


//예제 1
#include <stdio.h>
int main(void) {
    int printmeArr[5] = { 123, 456, 789 };
    
    for (int i = 0; i < 5 ;i++)
        printf("%d \n", printmeArr[i]);
    
    return 0;
}


//실행 결과
123
456
789
0
0

 

 

2차원 배열

<배열의 자료형> <배열의 이름>[<배열의 줄 수>][<배열의 칸 수>];

 2차원 배열은 '아파트'이다.

 

 

 ex) 초기값이 1, 2, 3, 4, 5, 6인 int형 "2줄 3칸" 2차원 배열 arr2.


//인덱스 순서대로 넣을 경우.
(1) int arr2[2][3] = { 1, 2, 3, 4, 5, 6 };

//줄과 칸을 명시적으로 구분해 놓을 경우.
(2) int arr2[2][3] = {{ 1, 2, 3 }, { 4. 5. 6 }};

 

 'int형 2차원 배열 arr2' 이라는 아파트에 2줄 3칸짜리 방이 있다. 여기에 1, 2, 3, 4, 5, 6의 사람들이 입주했다.

<int형 배열 arr2> <3칸>    
<2줄> 1 <[0][0]> 2 <[0][1]> 3 <[0][2]>
  4 <[1][0]> 5 <[1][1]> 6 <[1][2]>

 


//예제 2
#include <stdio.h>
int main(void) {
    int putArr2[4][3] = { 0, }; //배열의 값을 모두 0으로 초기화.
    int t = 0;
    
    for(int i = 0; i < 4; i++) {
        for(int j = 0; j < 3; j++) {
            putArr2[i][j] += t;
            printf("%d ", putArr2[i][j]);
            t++;
        }
        printf("\n");
    }
    return 0;
}


//실행 경과
0 1 2
3 4 5
6 7 8
9 10 11

 

 

3차원 배열

<배열의 자료형> <배열의 이름>[<배열의 개수>][<배열의 줄 수>][<배열의 칸 수>];

 3차원 배열은 여러 개의 2차원 배열이 모인 것이라 생각하면 쉽다.

 즉, 여러 개의 아파트가 모인 것.

 

 

 ex) 초기값이 1, 2, 3, 4, 5, 6, 7, 8인 int형 "2개 2줄 2칸" 3차원 배열 arr3.


//사용하는 방식은 2차원 배열과 많이 다르지 않습니다.
(1) int arr3[2][2][2] = { 1, 2, 3, 4, 5, 6, 7, 8 };

(2) int arr3[3][3][3] = { { { 1, 2 }, { 3, 4 } }, 
                        { { 5, 6 }, { 7, 8 } } }

 

2줄 2칸짜리 방이 있는 'int형 2차원 배열 arr3' 이라는 아파트가 2개 있다. (3차원 배열) 여기에 1, 2, 3, 4, 5, 6, 7, 8의 사람들이 입주했다.

<int형 배열 arr3> <2칸> <1개> <int형 배열 arr3> <2칸> <2개>
<2줄> 1 <[0][0][0]> 2 <[0][0][1]> <2줄> 5 <[1][0][0]> 6 <[1][0][1]>
  3 <[0][1][0]> 4 <[0][1][1]>   7 <[1][1][0]> 8 <[1][1][1]>

 2차원 배열이 여러 개 있다고 생각하면 된다.

 

 


//예제 3
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
	int arr3[2][7][5] = { 0, }; //모두 0으로 초기화.
	int apt1, apt2, apt3;
	char rpy;
	printf("2동 7층 5호....");
	printf("아파트 입주민 관리 \n");

	rtn:

	printf("몇동 몇층 몇호? : ");

	do {
		scanf("%d %d %d", &apt1, &apt2, &apt3);

		if ((apt1 <= 2 && apt1 >= 1) && (apt2 <= 7 && apt2 >= 1) && (apt3 <= 5 && apt3 >= 1)) {
			rpy = 0;
			break;
		}
		else
			printf("오류...다시 입력하세요...: ");

	} while (1);

	printf("%d동 %d층 %d호... 맞습니까? y/n: ", apt1, apt2, apt3);

	do {
		scanf("%c", &rpy);
	
		if (rpy == 'y') {
			printf("OK\n");
			rpy = 0;
			break;
		}
		else if (rpy == 'n')
			goto rtn; //(goto문) rtn으로 돌아갑니다.
			
	} while (1);

	printf("여기에 몇명이 살고 있습니까? : ");
	scanf("%d", &arr3[apt1 - 1][apt2 - 1][apt3 - 1]);

	
	for (int i = 0; i < 2; i++) {
		printf("%d동 \n", i + 1);

		for (int j = 6; j >= 0; j--) {
			printf("%d층: ", j + 1);

			for (int k = 4; k >= 0; k--) {
				printf("%d호: ", k + 1);
					printf("%d ", arr3[i][j][k]);
			}
			printf("\n");
		}
		printf("\n");
	}

	goto rtn;

	return 0;
}


//실행결과
2동 7층 5호....아파트 입주민 관리
몇동 몇층 몇호? : 0 1 2
오류...다시 입력하세요...: 1 2 3
1동 2층 3호... 맞습니까? y/n: n
몇동 몇층 몇호? : 2 7 5
2동 7층 5호... 맞습니까? y/n: y
OK
여기에 몇명이 살고 있습니까? : 6
1동
7층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0
6층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0
5층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0
4층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0
3층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0
2층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0
1층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0

2동
7층: 5호: 6 4호: 0 3호: 0 2호: 0 1호: 0
6층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0
5층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0
4층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0
3층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0
2층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0
1층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0

몇동 몇층 몇호? : 2 7 4
2동 7층 4호... 맞습니까? y/n: y
OK
여기에 몇명이 살고 있습니까? : 5
1동
7층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0
6층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0
5층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0
4층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0
3층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0
2층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0
1층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0

2동
7층: 5호: 6 4호: 5 3호: 0 2호: 0 1호: 0
6층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0
5층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0
4층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0
3층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0
2층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0
1층: 5호: 0 4호: 0 3호: 0 2호: 0 1호: 0

몇동 몇층 몇호? :

 

저도 아직 많이 미숙합니다.

오타, 지적 환영합니다.