본문 바로가기
알고리즘/백준

[백준 11507] 카드셋트 (C++)

by fortissimo 2024. 10. 3.

https://www.acmicpc.net/problem/11507

문제

최근에 진솔이는 로봇 공학을 하기 시작했다. 그래서 포커 카드가 완전한 세트인지 확인하는 로봇을 만들기로 결심했다.

그는 프로그램을 작성하는 일을 분담했다. 그 프로그램은 카드의 모양(스페이드(♠), 하트(♡), 다이아몬드(♢), 클럽(♣))을 인식하는 것이다. 문제를 간단하게 하기 위해서 모든 카드는 하나의 모양과 하나의 숫자를 가진다고 가정한다.

여기서 그 모양은 실제 그림 대신 문자로 대체한다. P,K,H,T에 해당한다. 그리고 숫자는 1~13에 해당하는 정수이다. 로봇은 각각의 카드를 TXY의 형태로 '카드 이름'을 정하는데 T는 모양에 해당하고 XY는 숫자에 해당한다. 만약 만약 숫자가 1자리 숫자이면 X=0에 해당한다. ex) 01.

만약에 모양이 P이고 숫자가 9이면 P09이다.

완벽한 카드 한 세트는 52개로 이루어져 있다. (4 (모양)x 13(숫자))

로봇은 모든 카드의 '카드이름'을 읽고 문자열 S로 결합한다.

이제 진솔이가 프로그래밍 하는 것을 도와주자.  문자열을 읽어 얼마나 많은 카드를 잃어버렸는지 세면 된다.

만약에 2개의 같은 카드가 존재한다면 GRESKA이라고 출력하면 된다.

 

입력


오직 1줄만 문자열 S(1 ≤ |S| ≤ 1000)가 들어온다. 이것은 현재 가지고 있는 카드 이름에 해당한다.

 

출력


만약 똑같은 카드가 존재한다면 GRESKA을 출력한다.

그렇지 않으면 4개의 정수를 공백 문자로 구분하여 출력한다. 각각 P, K, H, T에 해당한다.

 

문제 풀이


문자열 문제.

 

카드가 TXY형태로 주어지므로 S의 길이는 3의 배수이다. 입력받은 문자열을 3개씩 끊어서 각 카드를 저장한다.

아래 코드에는 4*13의 boolean 타입 배열을 사용하였다. 그리고 XY를 숫자로 변환하여 현재 가지고 있는 카드의 인덱스를 찾아 true로 변환하고, false인 칸의 개수를 각각 세어주었다.

각 카드가 하나씩밖에 존재하지 않고 여러개 존재하면 GRESKA를 출력하므로 set을 사용하여 카드 소유 여부를 판단해도 된다.

 

아래는 코드.

더보기
#include <iostream>
using namespace std;

int main()
{
	cin.tie(NULL);
	ios::sync_with_stdio(false);

	string str;
	cin >> str;
	bool** cards = new bool*[4];
	bool isDuplicated = false;
	for (int i = 0; i < 4; i++)
	{
		cards[i] = new bool[13];
		for (int j = 0; j < 13; j++)
		{
			cards[i][j] = false;
		}
	}
	for (int i = 0; i < str.length(); i += 3)
	{
		int num = (str[i + 1] - 48) * 10 + str[i + 2] - 48;
		int index = 0;
		if (str[i] == 'P')
		{
			index = 0;
		}
		else if (str[i] == 'K')
		{
			index = 1;
		}
		else if (str[i] == 'H')
		{
			index = 2;
		}
		else
		{
			index = 3;
		}
		if (cards[index][num - 1] == true)
		{
			cout << "GRESKA" << "\n";
			isDuplicated = true;
			break;
		}
		else
		{
			cards[index][num - 1] = true;
		}
	}
	if (isDuplicated == false)
	{
		for (int i = 0; i < 4; i++)
		{
			int count = 0;
			for (int j = 0; j < 13; j++)
			{
				if (cards[i][j] == false)
				{
					count++;
				}
			}
			cout << count << " ";
		}
	}
	return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준 21318] 피아노 체조 (C++)  (0) 2024.10.05
[백준 14916] 거스름돈 (C++)  (0) 2024.10.04
[백준 21276] 계보 복원가 호석 (C++)  (0) 2024.10.02
[백준 1063] 킹 (C++)  (0) 2024.09.30
[백준 2503] 숫자 야구 (C++)  (0) 2024.09.29