공부/Code Cata

문자열에서 영문 숫자 변환하기

동그래님 2024. 12. 31. 12:52

 

*unordered_map 사용한 초기 코드

더보기
#include <string>
#include <vector>
#include <unordered_map>

using namespace std;

string ConvertStirng(const unordered_map<string, string> NumList, const string& s)
{
    string Result;
    string Temp;

    for (char c : s)
    {
    	// 알파벳 발견 시, 한 글자씩 unordered_map 리스트에 검색하여 Result에 저장
        if (isalpha(c))
        {
            Temp += c;
            auto it = NumList.find(Temp);
            if (it != NumList.end())
            {
                Result += (*it).second;
                Temp.clear();
            }
        }
        // 알파벳이 아니라면 Result에 바로 저장
        else
        {
            Result += c;
        }
    }
    return Result;
}

int solution(string s)
{
    unordered_map<string, string> NumList =
    {
        {"zero","0"}, {"one","1"}, {"two","2"}, {"three","3"}, {"four","4"},
        {"five","5"}, {"six","6"}, {"seven","7"}, {"eight","8"}, {"nine","9"}
    };

    string Result = ConvertStirng(NumList, s);

    return stoi(Result);
}

 

*regex_replace 함수 사용한 코드

#include <string>
#include <vector>
#include <regex>

using namespace std;

int solution(string s)
{
    s = regex_replace(s, regex("zero"), "0");  
    s = regex_replace(s, regex("one"), "1");
    s = regex_replace(s, regex("two"), "2");
    s = regex_replace(s, regex("three"), "3");
    s = regex_replace(s, regex("four"), "4");
    s = regex_replace(s, regex("five"), "5");
    s = regex_replace(s, regex("six"), "6");
    s = regex_replace(s, regex("seven"), "7");
    s = regex_replace(s, regex("eight"), "8");
    s = regex_replace(s, regex("nine"), "9");

    return stoi(s);
}

성능면에서는 초기 작성한 코드가 더 좋지만 새로 알게된 regex_replace 함수를 사용해서 다시 풀어보았다.

확실히 코드 가독성면에서는 좋지만 실제로 사용은 거의 하지 않을 것 같다.

 

regex_replace에 대한 정리: https://dong-grae.tistory.com/84

 

std::regex_replace

regex_replace정규 표현식(regex)을 사용하여 문자열에서 특정 패턴을 찾아 다른 문자열로 교체하는 함수이다.C++ 표준 라이브러리의 헤더에 포함되어 있다. string regex_replace(const string& input, const regex&

dong-grae.tistory.com