본문 바로가기

알고리즘

알고리즘 문제 8. 중복없는 랜덤 구하기2

반응형

Joker를 포함한 53장의 카드를 섞은 후, 두 명의 플레이어에게 7장씩의 카드를 배분하는 프로그램을 만드시오.
A. ♠♣♥◆ 네 개의 기호 + 기호 별 각각 A, 2 ~ 10, J, Q, K 값의 카드 존재
B. 출력예시) Player 1 : ♥3, Joker, ♣A, ♣J, ◆1, ◆10, ♠4
Player 2 : ♥6, ◆2, ◆5, ♠Q, ♠K, ♣2, ♣3

내 풀이 )

#include <iostream>
int main()
{

	char card_num[13] = {'A','2' ,'3' ,'4' ,'5' ,'6' ,'7' ,'8','9','10','J','Q','K'};
	char card_img[4] = { '♠','♣','♥','◆' };
	
	
	
	srand(time(NULL));

	//유저에게 카드를 번호를 나눠줌
	int player[14] = {0};
	
	int card_rand = rand() % 53;

	
	//플레이어 랜덤값
	for (int i = 0; i < 14; i++)
	{
		while (1)
		{
			int search = 0;

			for (int j = 0; j < i; j++)
			{
				if (player[j] == card_rand)
				{
					search = 1;
					card_rand = rand() % 53;
				}
			}

			if (search == 0) {
				break;
			}
		}
		player[i] = card_rand;
	}


	for (int i = 0; i < 14; i++)
	{
		if (i == 0) {
			std::cout << "Player 1 : ";
		}
		else if(i == 7) {
			std::cout << std::endl;
			std::cout << "Player 2 : ";
		}



		if (i < 7) {
			int x = player[i] / 13; //0 ~ 12 은 0, 13 ~ 25은 1, ...
			int y = player[i] % 13; //0 ~ 12나옴

			switch (x)
			{
			case 0: std::cout << "♠";  break;
			case 1: std::cout << "♣";  break;
			case 2: std::cout << "♥";  break;
			case 3: std::cout << "◆";  break;
			}


			if (y == 9) {
				std::cout << "10" << ",";
			}
			else if (x == 4 && y == 0) {
				std::cout << "◆";
				std::cout << card_num[y] << ",";
			}
			else if(x == 4 && y == 0) {
				std::cout << "Joker" << ",";

			}
			else {
				std::cout << card_num[y] << ",";
			}

		}
		else
		{
			int x = player[i] / 13; //0 ~ 12 은 0, 13 ~ 25은 1, ...
			int y = player[i] % 13; //0 ~ 12나옴

			switch (x)
			{
			case 0: std::cout << "♠";  break;
			case 1: std::cout << "♣";  break;
			case 2: std::cout << "♥";  break;
			case 3: std::cout << "◆";  break;
			}

			if (y == 9) {
				std::cout << "10" << ",";
			}else if (x == 4 && y == 0) {
				std::cout << "◆";
				std::cout << card_num[y] << ",";
			}
			else if (x == 4 && y == 0) {
				std::cout << "Joker" << ",";

			}
			else {
				std::cout << card_num[y] << ",";
			}

		}

		
	}
	std::cout << std::endl;
		for (int i = 0; i < 14; i++)
		{
			std::cout << player[i] << std::endl;
		}


	return 0;
}

문제점 ) 시간 복잡도가 올라가고 쓸데없는 코드가 많이 들어감. 이를 해결하기 위해 dowhile문으로 카드 배열을 true false로 받고 카드를 출력하는 형식으로 함

#include <iostream>

bool isCard[53] = { false };

using namespace std;

void playerCard(int* num)
{
	srand(time(NULL));
	
	for (int i = 0; i < 7; i++)
	{
		int random = 0;
		do
		{
			random = rand() % 53;
		} while (isCard[random] == true);

		isCard[random] = true;
		num[i] = random;
	}

}

std::string card(int index) 
{

	static const string card_number[] = { "A", "2","3","4","5","6","7","8","9","10","Q","K","J" };
	static const string card_img[] = { "♠","♣","♥","◆"};

	int card_number_type = index % 13;
	int card_img_type = index / 13;

	if (card_img_type == 4)
	{
		return "Joker";
	}

	return card_img[card_img_type] + card_number[card_number_type];
}


int main()
{
	int player1[7] = {0};
	playerCard(player1);

	for (int i = 0; i < 7; i++)
	{
		cout << card(player1[i]) << "   ";
	}
	


	return 0;
}
반응형