작성일 :

문제 링크

2684번 - 동전 게임

설명

40번 동전을 던진 결과 문자열이 주어졌을 때,

길이가 3인 연속된 부분 문자열 중 8가지 가능한 패턴("TTT", "TTH", ..., "HHH")이 각각 몇 번씩 등장하는지 세어 출력하는 문제입니다.


접근법

  • 길이가 정확히 40인 문자열이 주어지므로,
    인덱스 0부터 37까지 총 38개의 연속된 세 글자 구간을 만들 수 있습니다.
  • 각 구간에 대해 부분 문자열을 추출한 뒤,
    미리 정해둔 8가지 패턴별로 등장 횟수를 누적한 후 출력합니다.


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
using System;
using System.Collections.Generic;

class Program {
  static void Main() {
    var patterns = new List<string> {
      "TTT", "TTH", "THT", "THH",
      "HTT", "HTH", "HHT", "HHH"
    };

    int t = int.Parse(Console.ReadLine());
    while (t-- > 0) {
      string s = Console.ReadLine();
      var freq = new Dictionary<string, int>();
      foreach (var pat in patterns) freq[pat] = 0;

      for (int i = 0; i < 38; i++) {
        string sub = s.Substring(i, 3);
        if (freq.ContainsKey(sub)) freq[sub]++;
      }

      foreach (var pat in patterns)
        Console.Write(freq[pat] + " ");
      Console.WriteLine();
    }
  }
}

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
#include <bits/stdc++.h>
using namespace std;

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

  vector<string> patterns = {
    "TTT", "TTH", "THT", "THH",
    "HTT", "HTH", "HHT", "HHH"
  };

  int t; cin >> t;
  while (t--) {
    string s; cin >> s;
    map<string, int> freq;

    for (int i = 0; i < 38; ++i)
      freq[s.substr(i, 3)]++;

    for (const auto& p : patterns)
      cout << freq[p] << " ";
    cout << "\n";
  }

  return 0;
}