본문 바로가기

알고리즘

알고리즘 문제 9. 랜덤값 빙고 만들기

반응형

1 ~ 25까지의 숫자가 랜덤하게 배치되는 5X5의 빙고게임 판을 생성한 후, 숫자 입력을 받을 때마다 해당 숫자를 지워주고 가로, 세로, 대각선의 빙고 줄이 완성될 때마다 빙고 개수를 갱신해서 표시해 주는 빙고 게임을 제작 하시오.

내 풀이 )

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <conio.h>

int main()
{

	srand(time(NULL));

	int map[5][5];

	//빙고 랜덤
	int bingo_random = rand() % 25 + 1;

	int bingo[25] = { 0 };

	for (int i = 0; i < 25; i++)
	{
		while (1)
		{
			int search = 0;

			for (int j = 0; j < i; j++)
			{
				if (bingo[j] == bingo_random)
				{
					search = 1;
					bingo_random = rand() % 25 + 1;
				}
			}

			if (search == 0) {
				break;
			}
		}
		bingo[i] = bingo_random;
	}

	//맵 세팅
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			map[i][j] = bingo[5 * i + j];
		}
	}



	int n = 0;
	while (1)
	{
		
		for (int i = 0; i < 5; i++)
		{
			for (int j = 0; j < 5; j++)
			{
				std::cout << map[i][j] << "    ";
			}
			std::cout << std::endl;
		}
		
		
		
		std::cout << "현재 " << n << "줄의 빙고가 완성되었습니다." << std::endl;
		
		std::cout << "숫자를 입력해 주세요 : ";
		
		int ch = 0;
		scanf("%d", &ch);
		



		//입력 받은 번호 삭제
		for (int i = 0; i < 5; i++)
		{
			for (int j = 0; j < 5; j++)
			{
				if (map[i][j] == ch) {
					map[i][j] = 0;
				}
			}
		}


		int count_line_w[5] = { 5, 5 ,5, 5, 5 }; //가로줄 카운트
		int count_line_h[5] = { 5, 5 ,5, 5, 5 }; //세로줄 카운트
		int count_line_s1 = 5; //대각선 카운트
		int count_line_s2 = 5; //대각선 카운트


		for (int i = 0; i < 5; i++)
		{
			for (int j = 0; j < 5; j++)
			{

				//가로줄 카운트
				if (map[i][j] == 0)
				{
					count_line_w[i] -= 1;
				}/*
				else
				{
					count_line_w[i] = 0;
				}*/

				//세로줄 카운트
				if (map[j][i] == 0)
				{
					count_line_h[i] -= 1;
				}/*
				else
				{
					count_line_h[i] = 0;
				}*/

				//대각선 카운트 = 같으면 
				if (i == j && map[j][i] == 0)
				{
					count_line_s1 -= 1;
				}/*
				else {
					count_line_s1 = 0;
				}*/

				//대각선 카운트 오른쪽 위에서 아래로
				if ((4 - i) == j && map[j][i] == 0)
				{
					count_line_s2 -= 1;
				}/*
				else
				{
					count_line_s2 = 0;
				}*/
			}
		}

		int resultCount = 0;
		for (int i = 0; i < 5; i++)
		{
			if (count_line_w[i] == 0) {
				resultCount += 1;
			}
			
			if (count_line_h[i] == 0)
			{
				resultCount += 1;
			}
		}

		if (count_line_s2 == 0)
		{
			resultCount += 1;
		}
		else if (count_line_s1 == 0)
		{
			resultCount += 1;
		}


		n = resultCount;


		system("cls");
	}

	


	return 0;
}

문제점 : 소스가 번잡하고 최적화가 안되어 있어 수정이 필요 하고, 또한 매직 넘버를 사용하여, 사용자가 변경하기 힘듬

#include <iostream>

using namespace std;

#define BLANK 0

int main()
{

	//1. 빙고판을 초기화
	srand(time(NULL));
	bool isUsed[26] = { false };
	int board[5][5] = { 0 };
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			int n = 0;

			do
			{
				n = rand() % 25 + 1;
				
			} while (isUsed[n] == true);

			board[i][j] = n;
			isUsed[n] = true;
		}

	}

	int bingoCount = 0;
	while (bingoCount < 12) {
		system("cls");

		//2. 빙고 현황출력
		for (int i = 0; i < 5; i++)
		{
			for (int j = 0; j < 5; j++)
			{

				if (board[i][j] == BLANK)
				{
					cout << "\t";
				}
				else {
					cout << board[i][j] << "\t";
				}

			}
			cout << endl;

		}

		cout << "현제 " << bingoCount << "줄의 빙고가 완성되었습니다." << endl;

		//3.사용자로 부터 입력 받음
		cout << "숫자를 입력해주세요. : ";

		int input;
		cin >> input;

		//3-1. 오입력이 들어왓다면 
		if (input < 0 || input > 25)
		{
        	continue;
			//2번부터 다시 시작한다.
		}


		//4. 빙고판을 최신화 => 숫자를 지워 준다.
		for (int i = 0; i < 5; i++)
		{
			bool isExit = false;
			for (int j = 0; j < 5; j++)
			{
				if (board[i][j] == input)
				{
					board[i][j] = BLANK;
					isExit = true;
					break;
				}
			}

			if (isExit)
			{
				break;
			}
		}

		//5. 빙고 개수를 센다.
		// -  가로의 모든 숫자를 지운것
		int count = 0;
		for (int i = 0; i < 5; i++)
		{
			bool isBingo = true;
			for (int j = 0; j < 5; j++)
			{
				if (board[i][j] != BLANK)
				{
					isBingo = false;
					break;
				}
			}

			//0이 아닌게 있으면 false가 되기 때문에 true인 상태는 전부 0인상태임 => 빙고 이므로 count 해줌
			if (isBingo)
			{
				++count;
			}
		}

		// -  세로의 모든 숫자를 지운것
		for (int i = 0; i < 5; i++)
		{
			bool isBingo = true;
			for (int j = 0; j < 5; j++)
			{
				if (board[j][i] != BLANK)
				{
					isBingo = false;
					break;
				}
			}

			//0이 아닌게 있으면 false가 되기 때문에 true인 상태는 전부 0인상태임 => 빙고 이므로 count 해줌
			if (isBingo)
			{
				++count;
			}
		}

		// -  대각선의 모든 숫자를 지운것

		{
			bool isBingo = true;
			for (int i = 0; i < 5; i++)
			{
				if (board[i][i] != BLANK)
				{
					isBingo = false;
					break;
				}
			}

			//0이 아닌게 있으면 false가 되기 때문에 true인 상태는 전부 0인상태임 => 빙고 이므로 count 해줌
			if (isBingo)
			{
				++count;
			}
		}

		{
			bool isBingo = true;
			for (int i = 0; i < 5; i++)
			{
				if (board[i][4 - i] != BLANK)
				{
					isBingo = false;
					break;
				}
			}

			//0이 아닌게 있으면 false가 되기 때문에 true인 상태는 전부 0인상태임 => 빙고 이므로 count 해줌
			if (isBingo)
			{
				++count;
			}
		}

		bingoCount = count;


		//6. 2번 부터 다시 반복 한다.
	}

	return 0;
}
반응형