Algorithm

[2021 카카오 인턴십 코딩테스트/c++] 숫자 문자열과 영단어

angieveloper 2022. 5. 6. 17:57

 

✨ 문제 풀이

나는 문자열에서 한 글자씩 비교해가면서, 만약 숫자라면 그대로 숫자를 반환하고 zero~nine 의 문자열 중에 하나와 일치하면 그 숫자 (=인덱스)를 반환해주는 식으로 문제를 해결했다.

그래서 중요하게 생각한 부분이 문자열의 몇 번째 인덱스부터 확인할 건지 매개변수로 보내주는 것과, 숫자 또는 영단어에 해당하는 숫자뿐만 아니라 offset을 함께 반환해주는 것이었다. 그래서 두 개의 int를 반환해주어야 하기 때문에 vector를 이용해서 0번째에 저장된 데이터는 일치하는 숫자, 1번째에 저장된 데이터는 offset으로 반환했다.

 

🗓 코드

#include <string>
#include <vector>

using namespace std;

bool isIntegerNumber(char c)
{
    if (c - '0' >= 0 && c - '0' < 10)
        return true;
    return false;
}

vector<int> getNumberAndOffset(int start, string word)
{
    string numberWords[10] = {
        "zero",
        "one",
        "two",
        "three",
        "four",
        "five",
        "six",
        "seven",
        "eight",
        "nine"};
    string temp = "";
    int offset = 1;
    vector<int> result;
    
    if (isIntegerNumber(word[start]))
    {
        result.push_back((word[start] - '0'));
        result.push_back(offset);
        return result;
    }

    for (int s = start; s < word.size(); s++)
    {
        temp += word[s];
        for (int index = 0; index < 10; index++)
        {
            if (numberWords[index] == temp)
            {
                result.push_back(index);
                result.push_back(offset);
            }
        }
        offset += 1;
    }
    return result;
}

int solution(string s)
{
    int answer = 0;
    string answerInSentence;
    vector<int> numberAndOffset;

    int i;
    for (i = 0; i < s.size();)
    {
        numberAndOffset = getNumberAndOffset(i, s);
        answerInSentence += to_string(numberAndOffset[0]);
        i += numberAndOffset[1];
    }
    answer = stoi(answerInSentence);
    return answer;
}

 


 

그런데 정말 매번 문자열 문제를 풀 때마다 regex를 제대로 사용하지 못해서 시간을 많이 소요했다는 느낌을 받는다.

regex를 잘 이용해서 문자열 문제를 해결하도록 해야할 것 같다.

 

#include <string>
#include <regex>
using namespace std;

int solution(string s)
{
    int answer;
    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");
    answer = stoi(s);
    return answer;
}