1. 문제

문제 설명

영어가 싫은 머쓱이는 영어로 표기되어있는 숫자를 수로 바꾸려고 합니다. 문자열 numbers가 매개변수로 주어질 때, numbers를 정수로 바꿔 return 하도록 solution 함수를 완성해 주세요.


제한사항
  • numbers는 소문자로만 구성되어 있습니다.
  • numbers는 "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" 들이 공백 없이 조합되어 있습니다.
  • 1 ≤ numbers의 길이 ≤ 50
  • "zero"는 numbers의 맨 앞에 올 수 없습니다.

입출력 예

numbersresult
"onetwothreefourfivesixseveneightnine" 123456789
"onefourzerosixseven" 14067

 

 

2. 코드

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

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

    string num = "";
    for (char ch : numbers) {
        num += ch;
        
        // 반복자가 끝에 도달하지 않았으면
        if (m1.find(num) != m1.end())
        {
            // 자리 수 변경하고 일의 자리에 숫자를 넣음
            answer = answer * 10 + m1[num];
            // num 다시 초기화
            num = "";
        }
    }
    return answer;
}

 

 

3. 분석

영단어의 조합으로 되어있는 numbers가 있다.

map<string, int>로 선언된 m1에 키-값 페어로 영단어와 숫자를 매치해준다.

이제 numbers의 각 알파벳을 순회한다.

string 형의 num은 알파벳이 모여 하나의 숫자 영단어가 되면 해당하는 키-값 페어를 찾아 값을 반환하게 한다.

map의 find 문법은 반복자를 반환하므로, 반복자가 끝에 도달할 때 까지 자리 수를 증가시키며 해당하는 값을 더해준다.