작성일 :

문제 링크

11507번 - 카드셋트

설명

P, K, H, T 네 가지 무늬의 카드들이 각각 **13장씩으로 이루어진 완전한 카드 세트에서,**

입력 문자열로 주어진 카드들을 읽고 중복 여부를 검사한 뒤, 누락된 카드 수를 계산하는 문제입니다.


각 카드는 무늬(P, K, H, T)와 두 자리 숫자(01 ~ 13)로 구성되어 있으며,

카드가 중복되어 등장한 경우에는 "GRESKA"를 출력하고, 그렇지 않은 경우에는 각 무늬별로 남은 카드 수를 출력합니다.


접근법

입력 문자열을 3글자씩 묶어 각 카드의 무늬와 숫자를 분리해냅니다.

  • 카드의 무늬는 항상 첫 글자이며,
  • 두 번째, 세 번째 글자를 숫자로 해석해 카드 번호를 얻습니다.


각 무늬에 대해 1 ~ 13번 카드가 사용되었는지를 기록하기 위해 배열을 활용합니다.

  • 같은 카드가 두 번 등장하는 경우, 배열 값이 1 이상인지를 확인하여 중복을 판별합니다.
  • 중복이 확인되면 "GRESKA"를 출력하고 종료합니다.


중복 없이 모든 카드를 정상적으로 읽은 경우에는,

각 무늬별로 아직 등장하지 않은 번호의 개수를 세어 출력합니다.

  • P, K, H, T 각각에 대해 13 - 등장한 카드 수를 계산합니다.
  • 출력 순서는 P, K, H, T 순으로 고정합니다.



Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System;

class Program {
  static void Main() {
    string s = Console.ReadLine();
    int[] p = new int[14], k = new int[14], h = new int[14], t = new int[14];

    for (int i = 0; i < s.Length; i += 3) {
      string suit = s.Substring(i, 1);
      int num = int.Parse(s.Substring(i + 1, 2));

      if (suit == "P") p[num]++;
      else if (suit == "K") k[num]++;
      else if (suit == "H") h[num]++;
      else t[num]++;
    }

    for (int i = 1; i <= 13; i++) {
      if (p[i] > 1 || k[i] > 1 || h[i] > 1 || t[i] > 1) {
        Console.WriteLine("GRESKA");
        return;
      }
    }

    int countP = 0, countK = 0, countH = 0, countT = 0;
    for (int i = 1; i <= 13; i++) {
      if (p[i] == 0) countP++;
      if (k[i] == 0) countK++;
      if (h[i] == 0) countH++;
      if (t[i] == 0) countT++;
    }

    Console.WriteLine($"{countP} {countK} {countH} {countT}");
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <bits/stdc++.h>
using namespace std;

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

  int p[14] = {}, k[14] = {}, h[14] = {}, t[14] = {};

  string s; cin >> s;
  for (size_t i = 0; i < s.size(); i += 3) {
    int num = (s[i + 1] - '0') * 10 + (s[i + 2] - '0');
    if (s[i] == 'P') p[num]++;
    else if (s[i] == 'K') k[num]++;
    else if (s[i] == 'H') h[num]++;
    else t[num]++;
  }

  for (int i = 1; i < 14; ++i) {
    if (p[i] > 1 || k[i] > 1 || h[i] > 1 || t[i] > 1) {
      cout << "GRESKA\n";
      return 0;
    }
  }

  int ansP = 0, ansK = 0, ansH = 0, ansT = 0;
  for (int i = 1; i < 14; ++i) {
    ansP += !p[i];
    ansK += !k[i];
    ansH += !h[i];
    ansT += !t[i];
  }

  cout << ansP << " " << ansK << " " << ansH << " " << ansT << "\n";

  return 0;
}