C언어: 2차원 배열 예제 [바둑판]

지환·2022년 1월 7일
0

C언어

목록 보기
17/37
post-thumbnail

2차원 예제

  • 대부분 사람들이 2차원 배열을 어려워한다. 필자 또한 그렇다. 하지만 약하다고 가만히 있을 수 있나? 약점을 보안하고 장점으로 바꾸자.

1차원 배열을 사용해 바둑판 정보를 저장하는 코드

 1차원 배열을 사용해 바둑판 정보를 저장하고 알려주기
int main()
{

	char data[12] = { 0,0,2,0,1,1,0,0,2,1,0,2 };
	int x, y, i;
	for (i = 0; i < 12; i++) //for문을 통해서 값을 12번 돌고
	{
		x = i % 4 + 1; // 열번호 구하기 
		y = i / 4 + 1; //행번호 구하기
		printf("%d행 %d열에", y, x);
		if (data[i] == 1) printf("검은돌이 있습니다.\n");
		else if (data[i] == 2) printf("흰 돌이 놓여 있습니다.\n");
		else printf("는 돌이 놓여 있지 않습니다.\n");
	}

}
  • 1차원 배열을 -> 2차원 배열로 변환한 것이다. for문을 통해서 data의 범위 12까지 돌리고 i자체가 배열의 인덱스값으로 생각하면 편하다.
  • 그 배열의 인덱스 값을 x는 (열 번호) y는 (행 번호)로 나누어 계산한다.
  • 1차원 -> 2차원으로 변환 했다면, 마지막 조건문을 통해서 바둑돌을 놓는다.

2차원 배열을 이용하여 바둑판 정보 저장하는 코드

void main()
{
	char data[3][4] = { {0,0,2,0}, {1, 1, 0, 0} ,{2, 1, 0, 2} };
	int x, y;

	for(y = 0; y<3; y++)
		for (x = 0; x < 4; x++)
		{
			printf("%d행 %d열에", y + 1, x + 1);
			if (data[y][x] == 1) printf("검은 돌이 놓여 있습니다.\n");
			else if (data[y][x] == 2) printf("흰 돌이 놓여 있습니다.\n");
			else printf("는 돌이 놓여있지 않습니다.\n");
		}
}
  • 3행 4열로 구성된 2차원 배열이다. x(4) ,y(3)값이 의미한다.

  • 이중 for문을 통해서
    y = 1일 때(행이 1일 때) // x는 0~4 반복
    y = 2일 때(행이 2일 때) // 반복

  • 마지막 printf("%d행 %d열에" , y+1, x+1) 하는 이유는 우리가 표현한 2차원 배열에선 요소의 색인이 하나 적기 때문에 하나를 더해 표현한다. 쉽게 생각하면 시작점이 0이기 떄문에 더해준다고 생각하면 좋다.

  • data[y][x] 가 == 1일 떄 ,
    data[y][x] 가 == 2일 때, etc 나머지를 나눠서 경우를 나눈다.

문제

사용자로부터 층별로 두 가구가 사는 4층짜리 빌라의 가구별 거주 인원 수를 입력받고 층별로 두 가구가 사는 4층짜리 빌라고, 가로가 2이고 세로가 4인 2차원 배열로 표현해라.

int main()
{
	int Person[4][2];
	int Dong, a, b;

	for (a = 0; a < 4; a++) {
		for (b = 0; b < 2; b++) {
		
			printf("%d층 %d호 인구수. : ", a + 1, b + 1);
			scanf_s("%d", &Person[a][b]);

		}
			
	}
	
	for (a = 0; a < 4; a++)
	{
		Dong = 0;
		Dong += Person[a][0];
		Dong += Person[a][1];
		printf("%d층의 인구수 : %d\n", a + 1, Dong);
	}

}
  • 윗 부분은 전자에 했던 예제와 비슷해 설명하지 않겠다.
  • 밑에 for문을 통해서 출력하는 부분이다. Dong를 초기화하고 person[a][0]; person[a][1];의 값을 Dong에 저장하고 출력한다.

문제

가로의 길이가 9, 세로의 길이가 3인 int형 2차원 배열을 선언하여 구구단 중 2단,3단,4단을 저장해보자.

2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36

코드


void main()
{
	int i, j;
	int abb[3][9];
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 9; j++)
		{
			abb[i][j] = (i + 2) * (j + 1);
			printf("%d\t", abb[i][j]);
		}
		printf("\n");
	}


}
  • abb[i][j] = (i+2) * (j +1) 이 수식이 의미하는 바는
    i가 0이라고 가정 할 때, 9번 돌게 된다. 즉, 2 -> 9까지 반복
    i가 1이라고 가정 할 때, 9번 돌게 된다. 즉 3-> 9까지 반복

문제

1 2 3 4 >>>>>>>>>> 1 5
5 6 7 8 >>>>>>>>>> 2 6
/ / / / / >>>>>>>>>> 3 7
/ / / / / >>>>>>>>>> 4 8

위 그림의 형태대로 배열 A와 배열 B를 선언하자. 그리고 배열 A는 선언과 동시에 그림에서 명시하는 대로 초기화를 진행한다. 그리고 배열 B도 위 그림에서 보이는대로 초기화를 진행하되, 반드시 배열 A에 저장된 값을 이용해서 초기화를 진행한다.

void main()
{
	int aaa[2][4] = { {1,2,3,4}, {5, 6, 7, 8} };
	int abb[4][2];
	int i, j;

	for (i = 0; i < 2; i++)
	{
		for (j = 0; j < 4; j++)
		{
			abb[j][i] = aaa[i][j];
		}
	}

	for (i = 0; i < 4; i++)
	{
		for (j = 0; j < 4; j++)
		{
			printf("%d\n", abb[i][j]);
		}
		printf("\n");
	}

}
profile
아는만큼보인다.

0개의 댓글