[프로그래머스] 2021 카카오 채용연계형 인턴십 Lv1.숫자 문자열과 영단어

박민주·2021년 11월 1일
0

Programmers

목록 보기
2/13
post-thumbnail

처음에 다른 방법으로 하느라 시간을 좀 썼는데
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;
}
profile
Game Programmer

0개의 댓글