1. 1 ~ 25까지의 숫자가 랜덤하게 배치되는 5X5의 빙고게임 판을 생성한 후, 숫자 입력을 받을 때마다 해당 숫자를 지워주고 가로, 세로, 대각선의 빙고 줄이 완성될 때마다 빙고 개수를 갱신해서 표시해 주는 빙고 게임을 제작 하시오.
#include <iostream>
#include <time.h>
using namespace std;
int main()
{
srand(time(NULL));
int Bingo[100] = {};
int empty[100] = {};
for (int i = 0; i < 100; i++)
{
Bingo[i] = i + 1;
}
int iTemp, Index_1, Index_2;
// 숫자를 랜덤으로 섞는다.
for (int i = 0; i < 200; i++)
{
Index_1 = rand() % 100;
Index_2 = rand() % 100;
iTemp = Bingo[Index_1];
Bingo[Index_1] = Bingo[Index_2];
Bingo[Index_2] = iTemp;
}
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if (empty[i * 10 + j] == ' ')
{
cout << empty[i * 10 + j] << '\\t';
}
else
{
cout << Bingo[i * 10 + j] << '\\t';
}
}
cout << endl;
}
//게임 시작
while (true)
{
//별을 위한 배열
int InputNum;
cout << "\\n\\n숫자를 입력해 주세요 : ";
cin >> InputNum;
cout << endl;
for (int i = 0; i < 100; i++)
{
if (Bingo[i] == InputNum)
{
empty[i] = ' ';
cout << i << "번째에서 같습니다." << endl;
continue;
}
}
cout << endl;
system("cls");
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if (empty[i * 10 + j] == ' ')
{
cout << empty[i * 10 + j] << '\\t';
}
else
{
cout << Bingo[i * 10 + j] << '\\t';
}
}
cout << endl;
}
int Bingo = 0;
//1. 가로 (행)
for (int i = 0; i < 100; i++)
{
if (i % 10 == 0)
{
int Row = 0;
for (int j = 0; j < 10; j++)
{
if (empty[i + j] == ' ')
{
Row++;
}
}
if (Row == 10)
{
Bingo++;
}
}
}
//2.세로 (열)
for (int i = 0; i < 100; i++)
{
int Col = 0;
for (int j = 0; j < 10; j++)
{
if (empty[i + j * 10] == ' ')
{
Col++;
}
}
if (Col == 10)
{
Bingo++;
}
}
//3.대각선
// "\\"
int Diagnol_1 = 0;
for (int i = 0; i < 100; i++)
{
if (i % 11 == 0)
{
if (empty[i] == ' ')
{
Diagnol_1++;
}
}
}
if (Diagnol_1 == 10)
{
Bingo++;
}
// "/"
int Diagnol_2 = 0;
for (int i = 1; i < 99; i++)
{
if (i % 9 == 0)
{
if (empty[i] == ' ')
{
Diagnol_2++;
}
}
}
if (Diagnol_2 == 10)
{
Bingo++;
}
// 출력부
cout << "\\n" << "현재 " << Bingo << "줄의 빙고가 완성되었습니다." << endl;
if (Bingo == 5)
{
cout << "BINGO!" << endl;
break;
}
}
return 0;
}
수업_빙고 솔루션
#include <iostream>
using namespace std;
#define BLANK 0;
int main()
{
// 1. 빙고 판을 초기화
srand(time(NULL));
int isUsed[26] = { false };
int board[5][5];
for (int r = 0; r < 5; r++)
{
for (int c = 0; c < 5; c++)
{
int N = 0;
do
{
N = 1 + rand() % 25;
} while (isUsed[N]);
board[r][c] = N;
isUsed[N] = true;
}
}
int bingoCount = 0;
while (bingoCount < 12)
{
system("cls");
// 2. 빙고 현황 출력
for (int r = 0; r < 5; r++)
{
for (int c = 0; c < 5; c++)
{
if (board[r][c] == 0) //BLANK 쓰면 =를 의도했냐고 되물음
{
cout << "\\t";
}
else
{
cout << board[r][c] << "\\t";
}
}
cout << endl;
}
cout << "현재 " << bingoCount << "줄의 빙고가 완성되었습니다.\\n";
// 3. 사용자로부터 입력을 받음
cout << "숫자를 입력해주세요 : ";
int input;
cin >> input;
// 3-1. 오입력이 들어왔다면
if (input < 0 || input > 25)
{
// 2번부터 다시 시작한다.
continue;
}
// 4. 빙고판을 최신화 => 해당 숫자를 지워준다.
for (int r = 0; r < 5; r++)
{
bool isExit = false;
for (int c = 0; c < 5; c++)
{
if (board[r][c] == input)
{
board[r][c] = BLANK;
isExit = true;
}
}
if (isExit)
{
break;
}
}
// 5. 빙고 개수를 센다.
// : 가로의 모든 숫자를 지운 것
int count = 0;
for (int r = 0; r < 5; r++)
{
bool isBingo = true;
for (int c = 0; c < 5; c++)
{
if (board[r][c] != 0)
{
isBingo = false;
break;
}
}
if (isBingo)
{
++count;
}
}
//board[0][0] / board[0][1] / ... board[0][4]
// : 세로의 모든 숫자를 지운 것
for (int r = 0; r < 5; r++)
{
bool isBingo = true;
for (int c = 0; c < 5; c++)
{
if (board[c][r] != 0)
{
isBingo = false;
break;
}
}
if (isBingo)
{
++count;
}
}
// : 대각선의 모든 숫자를 지운 것
// board[0][0] / [1][1] / [2][2] / [3][3] / [4][4]
{
bool isBingo = true;
for (int i = 0; i < 5; i++)
{
if (board[i][i] != 0)
{
isBingo = false;
break;
}
}
if (isBingo)
{
count++;
}
}
// [0][4] / [1][3] / [2][2] / [3][1] / [4][0]
{
bool isBingo = true;
for (int i = 0; i < 5; i++)
{
if (board[i][4 - i] != 0)
{
isBingo = false;
break;
}
}
if (isBingo)
{
count++;
}
}
bingoCount = count;
}
// 6. 2번부터 다시 반복한다.
}
N * N 달팽이 배열 알고리즘을 구현 하시오.
#include <iostream>
using namespace std;
int main()
{
// 1. 배열 만들기
cout << "배열의 크기를 입력하세요 : ";
int size;
cin >> size;
// 3
int* arr = new int[size * size];
// arr[2][3]
// arr [2 * size + 3]; 에서 size는 가로길이
memset(arr, 0, sizeof(int) * size * size);
// 2. 달팽이 배열 세팅
enum Direction {DIR_RIGHT, DIT_DOWN, DIR_LEFT, DIR_UP, DIR_MAX};
int r = 0;
int c = 0;
int footstep = 1;
Direction direction = DIR_RIGHT;
for (int i = 0; i < size * size; i++)
{
// 2-2. 발자국을 남긴다.
arr[r * size + c] = footstep;
++footstep;
// 2-3. 다음칸으로 이동한다.
// 2-3-1. 오른쪽으로 갈 때 => c += 1
// 2-3-2. 아래쪽으로 갈 때 => r += 1
// 2-3-3. 왼쪽으로 갈 때 => c -= 1
// 2-3-4. 위쪽으로 갈 때 => r -= 1
}
// 3. 출력
for (int r = 0; r < size; r++)
{
for (int c = 0; c < size; c++)
{
cout << arr[r * size * c] << "\\t";
}
cout << "\\n";
}
delete[] arr;
}
LOOK UP - TABLE
달팽이 솔루션
#include <iostream>
using namespace std;
#define NOT_VISITED 0
int main()
{
// 1. 배열 만들기
cout << "배열의 크기를 입력하세요 : ";
int size;
cin >> size;
// 3
int* arr = new int[size * size];
// arr[2][3]
// arr [2 * size + 3]; 에서 size는 가로길이
memset(arr, 0, sizeof(int) * size * size);
// 2. 달팽이 배열 세팅
enum Direction {DIR_RIGHT, DIR_DOWN, DIR_LEFT, DIR_UP, DIR_MAX};
int r = 0; // 달팽이 가로 좌표
int c = 0; // 달팽이 세로 좌표
int footstep = 1; // 왔던 길
Direction direction = DIR_RIGHT;
int arrNum = 0;
for (int i = 0; i < size * size; i++)
{
// 2-2. 발자국을 남긴다.
arr[r * size + c] = footstep;
++footstep;
// 2-3, 이동할 위치를 계산한다.
static const int dr[] = { 0, 1, 0, -1 };
static const int dc[] = { 1, 0, -1, 0 };
// DIR_RIGHT(0) : r = r + dr[0] = r + 0 / c = c + dc[0] = c + 1
// DIR_DOWN(1) : r = r + dr[1] = r + 1 / c = c + dc[1] = c + 0
// DIR_LEFT(2) : r = r + dr[2] = r + 0 / c = c + dc[2] = c - 1
// DIR_UP(3) : r = r + dr[3] = r - 1 / c = c + dc[3] = c + 0
int nr = r + dr[direction];
int nc = c + dc[direction];
// 오른쪽으로 갈 때 : r = r + 0/ c = c + 1 / direction == DIR_RIGHT(0)
// 아래로 갈 때 : r = r + 1 / c = c + 0/ direction == DIR_DOWN(1)
// 왼쪽으로 갈 때 : r = r + 0/ c = c - 1 / direction == DIR_LEFT(2)
// 위로 갈 떄 : r = r - 1 / c = c + 0 / direction == DIR_UP(3)
// 2-3. 다음칸으로 이동한다.
/*switch (direction)
{
case DIR_RIGHT:
if (c != size - 1)
{
++c;
}
else
{
direction = DIR_DOWN;
++r;
}
break;
case DIR_DOWN:
++r;
break;
case DIR_LEFT:
--c;
break;
case DIR_UP:
--r;
break;
}*/
// 2-4. 이동이 가능한지 판별한다.
// 2-4-1. 벽에 닿았을 때 => r, c의 위치가 [0, size]
// 2-4-2. 이미 지나온 곳일 때 => arr[nr][nc] != 0
if (nr < 0 || nr >= size || nc < 0 || nc >= size || arr[nr * size + nc] != NOT_VISITED)
{
// 2-5. 이동이 불가능하므로 방향 전환을 한다.
direction = (Direction)((direction + 1) % DIR_MAX);
// 2-6. 위치값을 다시 계산한다.
nr = r + dr[direction];
nc = c + dc[direction];
}
// 2-7 이동한다.
r = nr;
c = nc;
// 2-3-1. 오른쪽으로 갈 때 => c += 1
// 2-3-2. 아래쪽으로 갈 때 => r += 1
// 2-3-3. 왼쪽으로 갈 때 => c -= 1
// 2-3-4. 위쪽으로 갈 때 => r -= 1
}
// 3. 출력
for (int r = 0; r < size; r++)
{
for (int c = 0; c < size; c++)
{
cout << arr[r * size + c] << "\\t";
}
cout << "\\n";
}
delete[] arr;
}