처음에 다른 방법으로 하느라 시간을 좀 썼는데
regex의 regex()와 regex_replace()를 사용하면 간단히 풀리는 문제였다
라이브러리 공부의 필요성을 느꼈다..!
regex_replace()는 헤더에 정의된 STL 정규 표현식 라이브러리에 정의되어있다.
이 메서드는 첫번째 매개변수로 주어진 문자열에서
두번째 매개변수인 regex()를 통해 주어진 문자열을 찾아
세번째 매개변수의 문자열로 바꾸어준다.
그리고 바꾸어진 문자열을 반환한다.
std::string 클래스에 내장되어 있는 replace()라는 메서드도 있는데,
반복문에서 호출하니까 에러가 떠서 regex 쪽 메서드로 바꾸었다.
아마 반복해서 호출되면 안되는 게, 문자열의 길이가 줄어드는 것과 관련하여 인덱스 지정 문제가 아닐까 싶었다.
#include <iostream>
#include <string>
#include <algorithm>
#include <regex>
using namespace std;
#define WORD_SIZE 10
void SetWordArray(string word[])
{
word[0] = "zero";
word[1] = "one";
word[2] = "two";
word[3] = "three";
word[4] = "four";
word[5] = "five";
word[6] = "six";
word[7] = "seven";
word[8] = "eight";
word[9] = "nine";
}
int solution(string s)
{
int answer = 0;
string wordTable[WORD_SIZE];
SetWordArray(wordTable);
string find_str;
for(int i=0; i<WORD_SIZE; i++)
{
find_str = wordTable[i];
s = regex_replace(s, regex(wordTable[i]), to_string(i));
}
answer = stoi(s);
return answer;
}
처음에는 replace() 를 몰라서 위 사진과 같이 알고리즘을 생각했다.
그리고 위 알고리즘으로 구현했을 때에는 시간초과로 모든 테스트 케이스에 실패가 떴다 ㅜ
대부분 첫 글자를 통해 이 단어와 맞는지 틀리는지 걸러지겠지만
모든 인덱스를 '그냥' 지나칠 수 없다는 점에서 시간초과가 뜨는가 싶어
아래 코드에서 처럼 JumpWordTableIdx()라는 함수를 만들었다.
첫글자만 보고 영단어 테이블 검사를 건너뛸 수 있도록 했더니 10개 중 7개는 통과할 수 있었다
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <cctype>
#include <cmath>
using namespace std;
#define WORD_SIZE 10
void SetWordArray(string word[])
{
word[0] = "zero";
word[1] = "one";
word[2] = "two";
word[3] = "three";
word[4] = "four";
word[5] = "five";
word[6] = "six";
word[7] = "seven";
word[8] = "eight";
word[9] = "nine";
}
// 첫글자를 검사해서 영단어 테이블을 점프하게 만들자
int JumpWordTableIdx(char firstWord)
{
switch(firstWord)
{
case 'o':
return 1;
case 't':
return 2;
case 'f':
return 4;
case 's':
return 6;
case 'e':
return 8;
case 'n':
return 9;
}
return -1;
}
int solution(string s)
{
int answer = 0;
string wordTable[WORD_SIZE];
vector<int> result;
SetWordArray(wordTable);
int length = 0;
for(int i=0; i<s.size(); i++)
{
if(isdigit(s[i]))
{
result.push_back(s[i] - '0');
length++;
}
else
{
int startIdx = JumpWordTableIdx(s[i]);
for(int j=startIdx; j<WORD_SIZE; j++)
{
string temp = wordTable[j];
int count = 0;
for(int k=0; k<temp.size(); k++)
{
if(temp[k] == s[i])
{
i++;
count++;
}
else
{
for(int c=0; c<count; c++)
{
i--;
}
break;
}
}
if (count == temp.size())
{
result.push_back(j);
i--;
length++;
break;
}
}
}
}
vector<int>::iterator iter;
int i;
for(iter=result.begin(), i = length; iter != result.end(), i>0; iter++, i--)
{
answer += *iter * pow(10, i-1);
}
return answer;
}