숫자 문자열과 영단어

문제 링크

숫자 문자열과 영단어

분석

영단어를 정수로 바꾸거나 문자로 된 숫자를 정수로 바꾸어 반환하는 문제입니다.

문자열에서 자릿수의 영단어로 값을 찾으므로 map자료형을 사용합니다.
키값이 중복되지 않으므로 unordered_map을 사용합니다.

반복문을 사용해 각 인덱스를 확인해 문자로 된 숫자인지 확인합니다.
문자로 된 숫자라면 정수로 값을 저장합니다.

인덱스가 영단어의 일부인 알파벳인 경우 하나씩 저장하며, 맵에 저장된 키가 있는지 확인합니다.
키값이 있다면 해당 밸류값을 가져와 정수로 변환해 저장합니다.

문자열의 앞부분부터 순서대로 자릿수를 가지므로, 문자를 정수로 바꿀때마다 10을 곱하고 더해주어야 합니다.

풀이

#include <string>
#include <unordered_map>

int solution(std::string s) {
    int answer = 0;

    std::unordered_map<std::string, int> umap;

    umap.insert(std::make_pair("zero", 0));
    umap.insert(std::make_pair("one", 1));
    umap.insert(std::make_pair("two", 2));
    umap.insert(std::make_pair("three", 3));
    umap.insert(std::make_pair("four", 4));
    umap.insert(std::make_pair("five", 5));
    umap.insert(std::make_pair("six", 6));
    umap.insert(std::make_pair("seven", 7));
    umap.insert(std::make_pair("eight", 8));
    umap.insert(std::make_pair("nine", 9));

    std::string currrentWord;
    for (int i = 0; i < s.length(); ++i)
    {
        currrentWord.push_back(s[i]);

        if (std::isdigit(s[i]))
        {
            answer *= 10;
            answer += s[i] - '0';
            currrentWord = "";
            continue;
        }

        std::unordered_map<std::string, int>::iterator findIter = umap.find(currrentWord);
        if (findIter != umap.end())
        {
            answer *= 10;
            answer += findIter->second;
            currrentWord = "";
        }
    }

    return answer;
}

if (std::isdigit(s[i]))에서 해당 인덱스가 문자로 숫자인지 확인합니다.

if (findIter != umap.end())에서 str로 키를 찾았는지 확인합니다.

성능 요약

테스트 1 〉 통과 (0.01ms, 4.13MB)
테스트 2 〉 통과 (0.02ms, 3.59MB)
테스트 3 〉 통과 (0.01ms, 4.06MB)
테스트 4 〉 통과 (0.01ms, 4.2MB)
테스트 5 〉 통과 (0.02ms, 4.2MB)
테스트 6 〉 통과 (0.03ms, 4.15MB)
테스트 7 〉 통과 (0.01ms, 4.15MB)
테스트 8 〉 통과 (0.01ms, 4.11MB)
테스트 9 〉 통과 (0.02ms, 4.2MB)
테스트 10 〉 통과 (0.01ms, 4.16MB)

Programmers 카테고리 내 다른 글 보러가기

댓글남기기