프로그래머스의 숫자 문자열과 영단어 문제이다.

 

[ 문제풀이 ]

주어진 입력에서 영어로 표시되어 있는 숫자들을 모두 숫자로 바꾼 후에 출력을 해야 하는 문제이다.

 

#1. 영단어 관리

이 문제에서는 주어진 문자열을 숫자 형태로 바꿔 주어야 하는 것이 핵심적인 부분이다.

하나의 예로, "one" 이라는 문자열을 '1'로 바꿔 주어야 하는 것이다.

그래서, 본인은 zero ~ nine 이라는 문자열들을 map을 통해서 숫자로 변환을 시켜주었다.

여기서 숫자라는 것은, int형을 의미하는 것은 아니다. 본인은 "zero"를 문자열 "0"으로, "nine"을 문자열 "9"로 변환해 주었다. 이 과정에서 자료구조 map을 사용해 주었다. 이 부분을 코드로 표현하면 다음과 같다.

map<string, string> Convert;

void Make_Convert_Map()
{
    Convert["zero"] = "0";
    Convert["one"] = "1";
    Convert["two"] = "2";
    Convert["three"] = "3";
    Convert["four"] = "4";
    Convert["five"] = "5";
    Convert["six"] = "6";
    Convert["seven"] = "7";
    Convert["eight"] = "8";
    Convert["nine"] = "9";
}

위와 같이 map을 이용해서 영어로 표시된 숫자 문자열들을 숫자로 표시된 숫자 문자열로 변환시킬 수 있도록 map을 만들어 주었다. 여기서 왜 int형 숫자가 아닌, string 형 숫자로 변환했는지는 아래쪽에서 더욱 구체적으로 이야기를 해보자.

 

#2. 탐색 과정

이제 이를 기반으로 탐색을 진행하면 된다. 결론부터 이야기하자면, 본인은 주어진 문자열을 모두 숫자 문자열로 표현한 후에, 최종적으로 숫자 문자열로 표현되어 있는 것을 int형으로 변환시키는 과정을 진행해 주었다.

즉 !탐색을 할 때에는 무조건 string 형으로만 계산을 해 주었다.

탐색을 할 때에는 우리에게 2가지 상황이 주어질 것이다.

1. 현재 탐색하고 있는 문자가 숫자인 경우

현재 탐색하고 있는 문자가 숫자라면, 해당 문자를 Result에 추가해주기만 하면 된다.

예를 들어보자.

"4onetwo" 라는 문자열이 주어졌다. 현재까지는 아직 탐색을 하지 않았으므로, 우리가 구하고자 하는 숫자로만 이루어진 숫자문자열을 "Result" 라고 표현했을 때, Result = "" 빈 문자열일 것이다.

여기서 가장 처음 '4'를 만나게 되었을 때는, 이 '4'를 그냥 Result에 추가만 해주면 된다.

Result = "4" 가 될 것이다.

 

2. 현재 탐색하고 있는 문자가 영어인 경우

반대로, 알파벳인 경우가 존재할 것이다.

"4onetwo" 에서 Result = "4"인 상태에서, 그 다음 단어인 'o'를 탐색한다고 가정해보자.

'o'는 그 어떤 숫자와도 변환될 수 없는 문자열일 것이다. 이를 어떻게 알 수 있을까 ??

우리는 변환될 수 있는 문자열들에 대해서는 map에 모두 저장을 시켜 주었다.

즉 ! map["o"] 에는 아무런 값이 저장되어 있지 않을 것이다. 아무런 값이 저장되어 있지 않다면, "현재 탐색하고 있는 문자열에 추가"를 해주면 된다.

예를 들어서, 현재 탐색하고 있는 문자열을 "Cur" 이라고 표현해보자. 그럼, Cur = "o"가 될 것이다.

그 이후에, 'n'을 탐색해보자. Cur에 'n'을 추가하게 되면, Cur = "on"이 될 것이고, "on"또한 map에서 찾아보니 아무런 값이 저장되어 있지 않은, 즉 변환될 수 없는 문자열을 의미할 것이다.

이 후, 'e'를 탐색하게 되면, Cur = "one" 이 될 것이다. one은 map에서 찾아보게 되면 변환될 수 있는 문자열이고, 이를 Result에 추가해주면 된다.

즉, Result = "4" 인데, 여기에다가 Result += map["one"] 을 추가하면 될 것이다.

map["one"] 에는 "1"이라는 문자열이 저장되어 있다.

즉, Result = "41" 이 되는 것이다.

 

[ 소스코드 ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <string>
#include <vector>
#include <map>
using namespace std;
 
map<stringstring> Convert;
 
void Make_Convert_Map()
{
    Convert["zero"= "0";
    Convert["one"= "1";
    Convert["two"= "2";
    Convert["three"= "3";
    Convert["four"= "4";
    Convert["five"= "5";
    Convert["six"= "6";
    Convert["seven"= "7";
    Convert["eight"= "8";
    Convert["nine"= "9";
}
 
int Function(string Str)
{
    string Result = "";
    string Cur = "";
    for(int i = 0 ; i < Str.length(); i++)
    {
        if(isdigit(Str[i]) == 0)
        {
            Cur += Str[i];
            if(Convert[Cur] != ""
            {
                Result += Convert[Cur];
                Cur = "";
            }
        }
        else Result += Str[i];
        
    }
    return stoi(Result);
}
 
int solution(string s) 
{
    int answer = 0;
    Make_Convert_Map();
    answer = Function(s);
    return answer;
}
cs

 

+ Recent posts