C언어/참고서: C언어 콘서트

C언어 33차시 다차원 배열, 2차원 배열, 배열의 초기화, 행렬

Olivia-BlackCherry 2023. 3. 29. 14:50

목차

    다차원 배열은 배열 요소를 다차원으로 가진다. 

    2차원 배열, 3차원 배열, 4차원 배열... , n차원 배열을 뜻한다. 

    그러나 다차원이 되면 메모리 공간이 급격하게 늘어나기에 주의하자. 

     

    1차원 배열

    배열 요소들이 1차원적으로 배열되어 있다.

    int s[10];

     

     

    2차원 배열

    배열 요소들이 2차원으로 배열되어 있다. 

    행과 열을 나타내는 2개의 인덱스를 가진다. 

    ex) 아파트 3층, 한 층에 5가구가 산다. ----> 3x5 크기의 2차원 배열

    출처: c언어 콘서트

     

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