✏️ 다차원 배열
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 |
댓글