C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で文字列から重複のない年を抽出してカウントする方法

このチュートリアルでは、与えられた文字列の中から重複のない年(ユニークな年)を検出し、その総数を求めるC++プログラムを作成します。日付の形式は DD/MM/YYYY を前提とします。

問題の例

まず、具体的な例を見てみましょう。

  • 入力: 「01/11/2020、02/12/2020、03/10/2019」という日付を含むサンプルテキスト
  • 出力: 2

このテキストには「2020」と「2019」という2つの異なる年が含まれているため、出力は 2 となります。

解決のアプローチ

文字列から日付を抽出するには、正規表現(regex)を使用します。C++の正規表現に不慣れな方は、まず基礎的なチュートリアルを確認しておくと理解しやすくなります。

処理の手順は以下の通りです。

  1. 対象となるテキストを初期化します。
  2. テキストから日付を抽出するための正規表現パターンを定義します。
  3. 重複を排除するための空の unordered_set を用意します。
  4. 抽出した各日付を走査し、末尾4桁(年)をセットに追加していきます。セットは重複を自動的に排除するため、結果としてユニークな年だけが残ります。
  5. 最後にセットのサイズを出力します。これがユニークな年の総数です。

実装コード

それでは、実際のコードを見てみましょう。

#include <iostream>
#include <bits/stdc++.h>
#include <regex>
using namespace std;

int uniqueYearsCount(string text) {
    // 日付にマッチする正規表現
    regex date_regex("[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}");
    smatch matching_date;
    // ユニークな年を格納するセット
    unordered_set<string> dates;
    // すべての日付を検索
    while (regex_search(text, matching_date, date_regex)) {
        string date = matching_date[0];
        // 末尾4文字(年)を抽出してセットに追加
        dates.insert(date.substr(date.size() - 4));
        // 検索済み部分を除外して次へ
        text = matching_date.suffix();
    }
    return dates.size();
}

int main() {
    string text = "Sample example with dates 01/11/2020, 02/12/2020, and 03/10/2019.";
    cout << uniqueYearsCount(text) << endl;
    return 0;
}

実行結果

上記のコードを実行すると、次の出力が得られます。

2

応用:別の日付形式への対応

実際のデータでは、日付の形式は様々です。例えば YYYY-MM-DDMM-DD-YYYY のような形式に遭遇することもあります。その場合は、正規表現パターンを適宜変更するだけで対応できます。

例えば、「YYYY-MM-DD」形式に対応するには、パターンを次のように書き換えます。

regex date_regex("[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}");

この場合、年は先頭4文字に位置するため、抽出部分も date.substr(0, 4) に変更する必要がある点に注意してください。

まとめ

このチュートリアルでは、正規表現と unordered_set を組み合わせることで、文字列内からユニークな年を効率的に抽出・カウントする方法を学びました。正規表現のパターンを調整すれば、さまざまな日付形式に柔軟に対応できるのがポイントです。

本チュートリアルについて質問がある場合は、コメント欄でお気軽にお尋ねください。

  1. C++でN番目の偶数フィボナッチ数を求めるプログラム

    この問題では、整数値Nが与えられ、N番目の偶数フィボナッチ数を求めることが課題となります。フィボナッチ数列は、直前の2つの数を加えることで次の数を生成していく数列です。数列はF0とF1という2つの初期値から始まり、初期値には (0, 1) または (1, 1) が用いられます。問題の確認まず、具体例を使って問題を理解しましょう。入力 : N = 4 出力 : 144解法アプローチこの問題を解くためのシンプルな方法は、「フィボナッチ数列において3つごとの数が必ず偶数になる」という性質を利用することです。さらに、偶数のみを並べた数列も漸化式に従うという点がポイントです。偶数フィボナッチ数列の漸化式

  2. C++で文字列の部分文字列の総数を求める方法を解説

    この記事では、与えられた文字列から作成できる空でない部分文字列の個数を求める方法について解説します。入力 : string = "moon" 出力 : 10 説明 : 部分文字列は m、o、o、n、mo、oo、on、moo、oon、moon の 10 個です。 入力 : string = "yellow" 出力 : 21解法のアプローチ文字列の長さを n とします。上の例からも分かるように、考えられるすべての部分文字列の個数を求めるには、長さ n、(n-1)、(n-2)、(n-3)、……2、1 の部分文字列の個数を順に加算していく必要があります。部分文