반응형
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;
}
반응형
'알고리즘' 카테고리의 다른 글
알고리즘 문제 5. 별짓기 (0) | 2022.08.31 |
---|---|
알고리즘 문제 6. 버블정렬 (0) | 2022.08.31 |
알고리즘 문제 7. 중복없는 랜덤값 구하기 (0) | 2022.08.31 |
알고리즘 문제 9. 랜덤값 빙고 만들기 (0) | 2022.08.31 |
알고리즘 문제 4. 포인터 및 레퍼런스 활용 (0) | 2022.08.31 |