본문 바로가기
c언어 개발일지

[나도 코딩 C언어] 다차원 배열

by 노랑사랑팽이 2022. 9. 19.

✏️ 다차원 배열

Multidimensional Array

#include <stdio.h>

int main(void)
{
	int i; //ㅁ

	INT ARR[5]; 
	ㅁㅁㅁㅁㅁ 
	[0][1][2][3][4]
	
	int arr2[2][5];
	ㅁㅁㅁㅁㅁ
	ㅁㅁㅁㅁㅁ
	[0,0][0,1][0,2][0,3][0,4] -> arr1[0][2]
	[1,0][1,1][1,2][1,3][1,4]

	int arr3[3][2];
	ㅁㅁ
	ㅁㅁ
	ㅁㅁ

	int arr4[3][3][3];
	ㅁㅁㅁ //[0,0,0][0,0,1][0,0,2]
	ㅁㅁㅁ //[0,1,0][0,1,1][0,1,2]
	ㅁㅁㅁ //[0,2,0][0,2,1][0,2,2]

	ㅁㅁㅁ //[1,0,0][1,0,1][1,0,2]
	ㅁㅁㅁ //[1,1,0][1,1,1][1,1,2]
	ㅁㅁㅁ //[2,2,0][2,2,1][2,2,2]

	ㅁㅁㅁ //[2,0,0][2,0,1][2,0,2]
	ㅁㅁㅁ //[2,1,0][2,1,1][2,1,2]
	ㅁㅁㅁ //[2,2,0][2,2,1][2,2,2]
    
    return 0;
}

 

 

🔎 다차원 배열 선언

#include <stdio.h>

int main(void)
{
	int arr[5] = { 1,2,3,4,5 };
    
	int arr2[2][5] = {
		{ 1,2,3,4,5 },
		{ 1,2,3,4,5 }
	};

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

	int arr4[3][3][3] = {
		{
			{1,2,3},
			{1,2,3},
			{1,2,3}
		},
		{
			{1,2,3},
			{1,2,3},
			{1,2,3}
		},
		{
			{1,2,3},
			{1,2,3},
			{1,2,3}
		}
	};

	return 0;
}

 

 

🔎 다차원 배열 접근하기

#include <stdio.h>

int m_array_main(void)
{
	int arr3[4][2] = {
		{1,2},
		{1,2},
		{1,2},
		{1,2}
	};

	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			printf("2차원 배열 (%d, %d) 의 값 : %d\n", i, j, arr3[i][j]);
		}
		printf("\n");
	}

	int arr4[3][3][3] = {
		{
			{1,2,3},
			{1,2,3},
			{1,2,3}
		},
		{
			{11,12,13},
			{14,25,36},
			{17,28,39}
		},
		{
			{21,32,43},
			{51,62,73},
			{81,92,13}
		}
	};

	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			for (int k = 0; k < 3; k++)
			{
				printf("3차원 배열 (%d, %d, %d) 의 값 : %d\n", i, j, k, arr4[i][j][k]);
			}
		}
		printf("\n");
	}

	return 0;
}

 

 

✏️프로젝트

🔎 동물 뒤집기

#include <stdio.h>
#include <time.h>
// 10마리의 서로 다른 동물 (각 카드 2장씩)
// 사용자로부터 2개의 입력값을 받아서 -> 같은 동물 찾으면 카드 뒤집기
// 모든 동물 쌍을 찾으면 게임 종료!
// 총 실패 횟수 알려주기

int arrayAnimal[4][5]; // 카드 지도( 총20장의 카드 )
int checkAnimal[4][5]; //뒤집혔는지 여부 확인
char * strAnimal[10];

void initAnimalArray();
void initAnimalName();
void shuffleAnimal();
int getEmptyPosition();
int conv_pos_x(int x);
int conv_pos_y(int y);
void printAnimals();
void printQuestion();
int foundAllAnimals();

int main(void)
{
	srand(time(NULL));

	initAnimalArray();
	initAnimalName();

	shuffleAnimal();

	int failCount = 0; //실패횟수

	while (1)
	{
		int select1 = 0; //사용자가 선택한 처음 수
		int select2 = 0; //사용자가 선태한 두번째 수

		printAnimals(); //동물위치 출력
		printQuestion(); // 문제 출력(카드 지도)
		printf("뒤집을 카드를 2개 고르세요 : ");
		scanf_s("%d %d", &select1, &select2);

		if (select1 == select2)// 같은 카드 선택시 무효
			continue;

		//좌표에 해당하는 카드를 뒤집어 보고 같은지 안같은지 확인
		//정수 좌표를 (x,y)로 변환
		int firstSelect_x = conv_pos_x(select1);
		int firstSelect_y = conv_pos_y(select1);

		int secondSelect_x = conv_pos_x(select2);
		int secondSelect_y = conv_pos_y(select2);

		// 카드가 뒤집히지 않았는지 확인하고
		// 동시에 두 동물이 같은지 확인해야 함
		if ((checkAnimal[firstSelect_x][firstSelect_y] == 0
			&& checkAnimal[secondSelect_x][secondSelect_y] == 0)
			
			&& 
			
			(arrayAnimal[firstSelect_x][firstSelect_y] == arrayAnimal[secondSelect_x][secondSelect_y])) // 두 동물이 같은지
		{
			printf("\n\n 빙고! %s 발견 \n\n", strAnimal[arrayAnimal[firstSelect_x][firstSelect_y]]);
			checkAnimal[firstSelect_x][firstSelect_y] = 1;
			checkAnimal[secondSelect_x][secondSelect_y] = 1;
		}
		else // 다른 동물인 경우
		{
			printf("\n\n 땡! (틀렸거나, 이미 뒤집힌 카드입니다! \n");
			printf("%d : %s\n", select1, strAnimal[arrayAnimal[firstSelect_x][firstSelect_y]]);
			printf("%d : %s\n", select2, strAnimal[arrayAnimal[secondSelect_x][secondSelect_y]]);
			printf("\n\n");

			failCount++;
		}

		// 모든 동물을 찾았는지 여부 1 : 참, 0 : 거짓
		if (foundAllAnimals() == 1)
		{
			printf("축하합니다! 모든 동물을 다 찾았네요.\n");
			printf("지금까지 총 %d 번 실수하셨습니다.\n",failCount);
			break;
		}
	}

	return 0;
}

void initAnimalArray()
{
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			arrayAnimal[i][j] = -1;
		}
	}
}

void initAnimalName()
{
	strAnimal[0] = "원숭이";
	strAnimal[1] = "하마";
	strAnimal[2] = "강아지";
	strAnimal[3] = "고양이";
	strAnimal[4] = "돼지";
	strAnimal[5] = "코끼리";
	strAnimal[6] = "기린";
	strAnimal[7] = "낙타";
	strAnimal[8] = "타조";
	strAnimal[9] = "호랑이";
}

void shuffleAnimal()
{
	//■□□□□	
	//□□□□□
	//□□□■□
	//□□□□□
	//빈공간찾아서 동물이름 집어넣기
	//10X2 이중FOR문으로 랜덤으로~

	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			int pos = getEmptyPosition();
			int x = conv_pos_x(pos);
			int y = conv_pos_y(pos);

			arrayAnimal[x][y] = i;
		}
	}
}

// 좌표에서 빈공간 찾기
int getEmptyPosition()
{
	//■□□□□  0  1  2  3  4	
	//□□□□□  5  6  7  8  9
	//□□□■□ 10 11 12 13 14
	//□□□□□ 15 16 17 18 19

	while (1)
	{
		int randPos = rand() % 20; //0~19사이의 숫자 반환
		// 19 -> [3][4]
		int x = conv_pos_x(randPos);
		int y = conv_pos_y(randPos);

		if (arrayAnimal[x][y] == -1) // 빈공간이면 -1
		{
			return randPos;
		}
	}
	return 0;
}

int conv_pos_x(int x)
{
	//■□□□□  0  1  2  3  4	-> 0 0 0 0 0
	//□□□□□  5  6  7  8  9 -> 1 1 1 1 1
	//□□□■□ 10 11 12 13 14 -> 2 2 2 2 2
	//□□□□□ 15 16 17 18 19 -> 3 3 3 3 3
	// 19 -> [3][4]
	return x / 5;
}

int conv_pos_y(int y)
{
	//■□□□□  0  1  2  3  4	-> 0 1 2 3 4
	//□□□□□  5  6  7  8  9 -> 0 1 2 3 4
	//□□□■□ 10 11 12 13 14 -> 0 1 2 3 4
	//□□□□□ 15 16 17 18 19 -> 0 1 2 3 4
	// 19 -> [3][4]
	return y % 5; //y를 5로 나눈 나머지 값
}

void printAnimals()
{
	//□□□□□  1  1  2  2  3
	//□□□□□  3  4  4  5  5
	//□□□□□ 
	//□□□□□ 

	printf("\n ----이건 비밀인데, 몰래 보여줍니다.----\n\n");
	for(int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			printf("%8s", strAnimal[arrayAnimal[i][j]]);
		}
		printf("\n");
	}
	printf("\n ------------------------------------\n\n");
}

void printQuestion()
{
	printf("\n\n (문제)\n");
	int seg = 0;
	             //seg			       //checkAnimal									
	//■□□□□  하마  1  2  3    4	-> 1 0 0 0 0
	//□□□□□  5     6  7  8    9    -> 0 0 0 0 0
	//□□□■□  10    11 12 하마 14   -> 0 0 0 1 0
	//□□□□□  15    16 17 18   19   -> 0 0 0 0 0

	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			//카드를 뒤집어서 정답을 맞혔으면 '동물이름'
			if (checkAnimal[i][j] != 0)
			{
				printf("%8s", strAnimal[arrayAnimal[i][j]]);
			}
			else
			{
				printf("%8d", seg);
			}
			seg++;
			//아직 뒤집지 못했으면 (정답을 못맞혔으면) 뒷면 -> 위치를 나타내는 숫자
		}
		
		printf("\n");
	}
}

int foundAllAnimals()
{
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			if (checkAnimal[i][j] == 0)
			{
				return 0;
			}
		}
	}
	return 1; // 모두 다 찾음
}

 

 


🍏 KEEP, 습관 중요한 것

3차원 배열 이해할 때, 2차원 배열이 여러장 있다는 식으로 이해하고 넘어갔다.

컴퓨터는 배열 index값이 0부터 시작한다는 걸 항상 인지해야 한다.

 

🍎 PROBLEM, 이슈, 에러, 오류

프로젝트가 굉장히 코드가 길다.

이 과정에서 실행이 안되는 오류가 발생했다.

왜 이런 코드를 쓰는지 왜 이 명령어를 사용하는지 염두해두고 구현이 안되는 부분 코드를 중점적으로 보니 오류가 해결되었다.

 

 🍉 TRY 시도

프로젝트가 어떤 식으로 구현되는지 차근차근 이해하고 안보고 이를 직접 풀어봐야 겠다.

정보처리기사 실기 끝나고 해볼 계획이다!

'c언어 개발일지' 카테고리의 다른 글

malloc 함수로 메모리 할당  (1) 2022.09.19
[나도 코딩 C언어] 포인터  (0) 2022.08.16
[나도 코딩 C언어] 배열  (0) 2022.08.16
[나도 코딩 C언어] 함수  (0) 2022.08.12
[나도 코딩 C언어] 조건 / 분기  (0) 2022.08.12

댓글