본문 바로가기
coding/algorithm

[programmers] Lv.1 숫자 문자열과 영단어(c++)

by 눈부신음표 2022. 3. 8.
728x90

regex를 알게됨

 

아래 코드는 regex_replace를 알기 전 코드이다.

역시나 for문을 한번만 돌기위해 애씀

더보기
#include <bits/stdc++.h>

using namespace std;

int solution(string s) {
    vector<string> nums = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
    string answer;
    for(int i=0; i<s.length(); i++){
        if(isdigit(s[i])){ // 숫자면 answer에 추가하고 돌아감
            answer += s[i];
            continue;
        }
        switch(s[i]){ // 숫자가 아니면 해당 숫자를 찾아가서 answer에 추가
            case 'z':
                answer += '0';
                break;
            case 'o':
                answer += '1';
                break;
            case 't':
                if(s[i+1] == 'w') answer += '2';
                else answer += '3';
                break;
            case 'f':
                if(s[i+1] == 'o') answer += '4';
                else answer += '5';
                break;
            case 's':
                if(s[i+1] == 'i') answer += '6';
                else answer += '7';
                break;
            case 'e':
                answer += '8';
                break;
            case 'n':
                answer += '9';
                break;
        }
        i += nums[answer.back() - '0'].length() - 1; // 추가한 숫자의 영단어 길이-1만큼 index 이동
    }
    return stoi(answer);
}

문제 정리:

https://programmers.co.kr/learn/courses/30/lessons/81301

 

코딩테스트 연습 - 숫자 문자열과 영단어

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자

programmers.co.kr

input

  • string s : 네오가 프로도에게 건내준 문장

- 문장은 숫자의 일부 자릿수를 영단어로 바꾼것

- 이 문장을 원래 숫자로 리턴

output

  • s가 의미하는 원래 숫자(int)

제한사항

- 1<= len(s) <= 50

- s 가 zero 또는 0으로 시작하는 경우는 없다

- return 값이 1 이상 2,000,000,000 이하

728x90

[접근 1]

각 숫자의 영단어 길이에 쉽게 접근하기 위해 nums 라는 vector<string>을 만들었다.

vector<string> nums = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

[접근 2]

숫자면 string answer에 추가하고 for문으로 돌아감

string answer;
for(int i=0; i<s.length(); i++){
    if(isdigit(s[i])){ // 숫자면 answer에 추가하고 돌아감
        answer += s[i];
        continue;
    }

[접근 3]

숫자가 아니면 해당 숫자의 문자(앞 한글자)를 찾아가서 answer에 해당 숫자를 추가한다.

if else문보다 switch문이 더 접근이 빠르다고 배웠다.

따라서 switch문으로 앞 한글자가 일치하는 곳으로 가서 두번째 글자로 구별했다.

    switch(s[i]){ // 숫자가 아니면 해당 숫자를 찾아가서 answer에 추가
            case 'z':
                answer += '0';
                break;
            case 'o':
                answer += '1';
                break;
            case 't':
                if(s[i+1] == 'w') answer += '2';
                else answer += '3';
                break;
            case 'f':
                if(s[i+1] == 'o') answer += '4';
                else answer += '5';
                break;
            case 's':
                if(s[i+1] == 'i') answer += '6';
                else answer += '7';
                break;
            case 'e':
                answer += '8';
                break;
            case 'n':
                answer += '9';
                break;
        }

[접근 4]

인덱스 i 를 추가한 숫자의 영단어 길이 -1 만큼을 이동시킨다.

for문으로 돌아가서 +1이 되면 다음 숫자로 넘어가게 된다.

for문 끝

    i += nums[answer.back() - '0'].length() - 1; // 추가한 숫자의 영단어 길이-1만큼 index 이동
}

[접근 5]

문자열로 되어있는 answer 변수를 int로 바꿔서 return 해준다.

return stoi(answer);

About regex

https://www.cplusplus.com/reference/regex/regex_replace/#:~:text=std%3A%3Aregex_replace&text=Makes%20a%20copy%20of%20the,depending%20on%20the%20version%20used.

 

regex_replace - C++ Reference

c-string/string (2)template basic_string regex_replace (const charT*s, const basic_regex & rgx, const basic_string & fmt, regex_constants::match_flag_type flags = regex_constants::match_default); string/c-string (3)template basic_string regex_replace (cons

www.cplusplus.com

 

정규표현식 관련


regex

  • 정규표현식 객체 정의

regex re("정규표현식");


regex_match

  • 주어진 정규표현식을 완전히 만족하는지

regex_match("base string", regex("정규표현식"));

or

regex re("정규표현식");

regex_match("base string", re);

 

  • 주어진 정규표현식을 완전히 만족하는 string의 부분 추출
  • 정규표현식에서 괄호로 추출하고싶은 부분을 묶어줌
  • smatch 또는 cmatch로 선언한 변수에 부분이 들어감, match[1]로 출력하면됨
  • (match[0]엔 전체 string, match[1] 이후부터 만족하는 부분이 들어감)

smatch match;

regex_match("base string", match, regex("정규표현식"));

or

regex re("정규표현식");

regex_match("base string", match, re);


regex_replace

regex_replace("base string", regex("정규표현식"), "string to replace");

or

regex re("정규표현식");

regex_replace("base string", re, "string to replace);

ex) s = regex_replace(s, regex("zero"), "0");


regex_search

  • 주어진 정규표현식을 만족하는 부분을 검색(전체가 만족할 필요 없음)
  • match.suffix()를 사용하면 match한 부분 바로 다음 문자부터 문자열 끝까지를 가리키는 sub_match 객체를 리턴한다.

smatch match;

regex_search("base string", match, regex("정규표현식"));

or

regex re("정규표현식");

regex_search("base string", match, re);

 

 

더 자세한건 여기서...

참고 : https://modoocode.com/303

728x90

댓글