1. 문제

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.

다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

  • 1478 → "one4seveneight"
  • 234567 → "23four5six7"
  • 10203 → "1zerotwozero3"

이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.


숫자 영단어
   
0 zero
1 one
2 two
3 three
4 four
5 five
6 six
7 seven
8 eight
9 nine

제한사항
  • 1 ≤ s의 길이 ≤ 50
  • s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

입출력 예
"one4seveneight" 1478
"23four5six7" 234567
"2three45sixseven" 234567
"123" 123

 

2. 코드

더보기
#include <string>
#include <vector>
#include <map>
using namespace std;

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

        // 알파벳이면 스택에 저장
        // 완성된 스택을 숫자 단어와 비교해 일치하면 숫자를 반환
        // 스택 초기화
        for (auto& str : s)
        {
            if (isalpha(str))
            {
                temp.push_back(str);

                for (auto& num : numbers)
                {
                    if (temp.size() < 3)
                        break;

                    if (temp != num.first)
                        continue;
                    else
                    {
                        ans.push_back(num.second + '0');
                        temp = "";
                        break;
                    }
                }
            }
            if (isdigit(str))
            {
                ans.push_back(str);
            }
        }
    return answer = stoi(ans);
}

 

3. 분석

입력받은 문자열에서 숫자 영단어를 찾아 숫자로 변환하여 출력하는 문제이다.

map을 이용하여 각 숫자 영단어와 숫자를 페어링한다.

이후에 입력받은 문자열 s의 각 문자 하나씩(char)을 검증하여 숫자면 string 형태의 정답인 ans에 바로 넣고

영어면 string temp에 하나씩 넣는다.

 

또한 숫자 영단어는 최소 3개의 문자로 이루어져있으므로, 3개보다 적다면 스킵해준다(선택사항).

이후에 temp와 map의 각 원소를 대조해서 일치하면 ans에 map의 값을 넣어준다.

최종적으로 저장된 string 형 정답인 ans를 stoi 함수를 사용하여 int형으로 변환하여 정답을 출력한다.