공부 기록

[프로그래머스] level 1 - 숫자 문자열과 영단어 (C++) 본문

Algorithm/Programmers

[프로그래머스] level 1 - 숫자 문자열과 영단어 (C++)

혜멘 2022. 2. 16. 22:43

사실 간단한 문제라 포스팅까지는 안하려고 했는데, 짚고 넘어가고 싶은 부분이 있어서 글로 적어두기로 했다.

비루한 내 코드 아래에 문제 설명과 함께 예쁜 풀이도 같이 적어뒀다.

 

#include <string>
#include <vector>

using namespace std;
string number(int n) {
    if (n == 0) return "zero";
    else if (n == 1) return "one";
    else if (n == 2) return "two";
    else if (n == 3) return "three";
    else if (n == 4) return "four";
    else if (n == 5) return "five";
    else if (n == 6) return "six";
    else if (n == 7) return "seven";
    else if (n == 8) return "eight";
    else if (n == 9) return "nine";
}
int solution(string s) {
    // 0~9까지 영어로 바뀐 문자열을 원래대로 숫자로 되돌려 놓기
    string str; int idx = -1;
    for (int i = 0; i <= 9; i++)
    {
        str = number(i);
        idx = s.find(str);
        while (idx >= 0) { // 찾는 문자가 있으면
            s.replace(idx, str.size(), to_string(i)); // 숫자로 교체
            idx = s.find(str);
        }
    }
    return stoi(s);
}

 

숫자로 구성된 문자열의 일부를 영단어로 바꾼 문자열을 원래대로 돌려놓는 문제인데,

아무 생각 없이 if-else 문을 덕지덕지 해놓고 다른 사람들 풀이를 보니 그냥 string array로 깔끔하게 코드를 짜놓았다.

더 간략하게는 find와 replace 를 동시에 수행하는 regex_replace를 사용한 코드도 있었다.

 

물론 쉬운문제라면 복잡하게 생각할 필요 없이 휘리릭 짜고 넘어가면 되지만, 코드를 더 보기 좋게 줄일 수 있다면 그렇게 연습하는 것이 더 좋다고 생각하기 때문에 이렇게 글로 써 정리해둔다!

 

아래는 string array 와 refex_replace를 써서 풀이한 코드인데, 길이부터가 엄청나게 줄어든 것을 알 수 있다...

 

// #include <regex>
string str[] = {"zero", "one", ... , "eight", "nine"};
for(int i=0; i < 10, i++){
	s = regex_replace(s, regex(str[i]), to_string(i));
}

 

처음 풀 때부터 이렇게 갓벽하게 풀 수 있다면 얼마나 좋을까... 흙 흙

아 물론 실행시간은 거의 3배정도 더 걸리긴 했다. 과연 어떤게 더 좋은 코드인걸까? 코테용으로 볼땐 당연 후자려나?

 

 

 

Comments