Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 정규식으로 문자열에서 고유한 연도 개수 찾는 방법

이 튜토리얼에서는 주어진 문자열에 포함된 날짜들 중 고유한 연도(distinct year)의 개수를 찾는 C++ 프로그램을 작성해 보겠습니다. 여기서는 날짜 형식이 DD/MM/YYYY라고 가정합니다.

문제 이해하기

먼저 예제를 통해 문제를 살펴보겠습니다.

입력 — 날짜가 포함된 문자열: "01/11/2020, 02/12/2020, 그리고 03/10/2019"

출력 — 2

주어진 문자열에는 2020년과 2019년, 총 두 개의 서로 다른 연도가 존재하므로 결과는 2가 됩니다.

접근 방법

이 문제는 정규식(regex)을 활용하면 간단하게 해결할 수 있습니다. 정규식을 사용하면 문자열에서 날짜 패턴을 손쉽게 추출할 수 있습니다. C++에서 정규식이 익숙하지 않다면 관련 튜토리얼을 먼저 참고하는 것을 추천합니다.

전체적인 해결 과정은 다음과 같습니다.

  • 대상 문자열을 초기화합니다.
  • 문자열에서 날짜를 추출할 정규식 패턴을 작성합니다.
  • 고유한 값을 저장하기 위한 빈 unordered_set을 선언합니다.
  • 추출된 모든 날짜를 순회하면서 연도 부분만 집합에 삽입하여 중복을 제거합니다.
  • 집합의 크기를 출력합니다. 이것이 곧 고유한 연도의 개수입니다.

구현 예제

이제 실제 코드를 확인해 보겠습니다.

#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 같은 형식이라면 정규식 패턴만 해당 형식에 맞게 수정하면 됩니다. 핵심 로직은 동일하게 유지되며, 연도 위치에 따라 substr으로 잘라내는 부분만 조정하면 됩니다.

마무리

정규식과 unordered_set을 조합하면 문자열에서 고유한 연도를 효율적으로 찾을 수 있습니다. 시간 복잡도는 문자열 길이에 비례하며, 집합 연산은 평균 O(1)로 매우 빠릅니다. 튜토리얼에 대해 궁금한 점이 있다면 댓글로 남겨주세요.