본문 바로가기

C

다차원 배열(Multidimentional Array)

반응형
SMALL
다차원 배열
 다차원 배열(Multidimentional Array)
 #include <stdio.h>
int main(void) {

//	 1차원 배열
	int arr[5]; // ㅁㅁㅁㅁㅁ
	 [0] [1] [2] [3] [4]

//	 2차원 배열
	int arr2[2][5]; // 5개짜리가 2개
//	 ㅁㅁㅁㅁㅁ
//	 ㅁㅁㅁㅁㅁ
	 [0, 0] [0, 1] [0, 2] [0, 3] [0, 4] -> ex) arr2[0][0]
	 [1, 0] [1, 1] [1, 2] [1, 3] [1, 4] -> ex) arr2[1][0]
     
	int arr3[4][2]; // 2개짜리가 4개
//	 ㅁㅁ
//	 ㅁㅁ
//	 ㅁㅁ
//	 ㅁㅁ
	 [0, 0][0, 1] -> ex) arr3[0][0]
	 [1, 0][1, 1] -> ex) arr3[1][0]
	 [2, 0][2, 1] -> ex) arr3[2][0]
	 [3, 0][3, 1] -> ex) arr3[3][0]

//	 3차원 배열
	int arr4[3][3][3]; // 3개짜리가 3개씩 3개
//	 ㅁㅁㅁ
//	 ㅁㅁㅁ
//	 ㅁㅁㅁ

//	 ㅁㅁㅁ
//	 ㅁㅁㅁ
//	 ㅁㅁㅁ

//	 ㅁㅁㅁ
//	 ㅁㅁㅁ
//	 ㅁㅁㅁ
	 [0, 0, 0][0, 0, 1][0, 0, 2] -> ex) arr4[0][0][0]
	 [0, 1, 0][0, 1, 1][0, 1, 2] -> ex) arr4[0][1][0]
	 [0, 2, 0][0, 2, 1][0, 2, 2] -> ex) arr4[0][2][0]

	 [1, 0, 0][1, 0, 1][1, 0, 2] -> ex) arr4[1][0][0]
	 [1, 1, 0][1, 1, 1][1, 1, 2] -> ex) arr4[1][1][0]
	 [1, 2, 0][1, 2, 1][1, 2, 2] -> ex) arr4[1][2][0]

	 [2, 0, 0][2, 0, 1][2, 0, 2] -> ex) arr4[2][0][0]
	 [2, 1, 0][2, 1, 1][2, 1, 2] -> ex) arr4[2][1][0]
	 [2, 2, 0][2, 2, 1][2, 2, 2] -> ex) arr4[2][2][0]

	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} 
	};
	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}
		}, 
		{
			{1, 2, 3},
			{1, 2, 3},
			{1, 2, 3}
		}, 
		{
			{1, 2, 3},
			{1, 2, 3},
			{1, 2, 3}
		} 
	};
	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");
		}
		printf("\n");
	}
	return 0;
}

 

배열 프로젝트
// 카드뒤집기 배열 프로젝트
#include <stdio.h>
#include <time.h>

// 선언
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();

// 10마리의 서로 다른 동물(각 카드 2장씩)
// 사용자로부터 2개의 입력값을 받아서 -> 같은 동물 찾으면 카드 뒤집기
// 모든 동물 쌍을 찾으면 게임 종료
// 총 실패 횟수 알려주기
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", select2, strAnimal[arrayAnimal[secondSelect_x][secondSelect_y]]);
			printf("%d : %s\n", select1, strAnimal[arrayAnimal[firstSelect_x][firstSelect_y]]);
			printf("\n\n");

			failCount++; // 몇번 실수했는지 여부 확인
		}

		// 모든 동물을 찾았는지 여부, 1 : 참, 0 : 거짓
		if (foundAllAnimals() == 1) {
			printf("\n\n축하합니다!!모든 동물들을 다 찾았습니다.\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() {
	for (int i = 0; i < 10; i++) { // 총 10 x 2의 카드 중에서
		for (int j = 0; j < 2; j++) { // 1장의 동물을 넣으면 나머지 한장은 랜덤위치에 지정된다.
			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 -> 0 0 0 0 0 // 5로 나누었을 때 몫
	// ㅁㅁㅁㅁㅁ 5 6 7 8 9 -> 1 1 1 1 1  // 5로 나누었을 때 몫
	// ㅁㅁㅁㅁㅁ 10 11 12 13 14 -> 2 2 2 2 2 // 5로 나누었을 때 몫
	// ㅁㅁㅁㅁㅁ 15 16 17 18 19 -> 3 3 3 3 3 // 5로 나누었을 때 몫
	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) { // 값이 비어있다면은
			return randPos; // 비어있다면 현재 위치를 반환해줘
		}
	}
	return 0;
}

int conv_pos_x(int x) {
	// 19 -> (3, 4) -> (x, y)
	return x / 5;
}

int conv_pos_y(int y) {
	// 19 -> 19 / 5 -> 몫 3, 나머지 4
 	return y % 5; // y를 5로 나눈 나머지 값 // x값으로 몫을 사용하고 그 나머지 값도 활용하기 위해 사용
}

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 seq = 0;
					// seq				  // checkAnimal
	// ㅁㅁㅁㅁㅁ  0 1 2 3 4					0 0 0 0 0
	// ㅁㅁㅁㅁㅁ  하마 6 7 8 9				1 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", seq);
			}
			seq++;
		}
		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; // 카드를 모두 다 찾음
}
반응형
LIST

'C' 카테고리의 다른 글

파일 입출력(fputs, fgets, fprintf, fscanf)  (0) 2022.11.15
구조체(struct)  (0) 2022.11.14
포인터 & 배열, Swap  (0) 2022.11.05
배열  (2) 2022.10.26
함수  (0) 2022.10.23