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 이하
[접근 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
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);
더 자세한건 여기서...
'coding > algorithm' 카테고리의 다른 글
| [programmers] Lv.2 오픈채팅방(c++) (0) | 2022.04.18 |
|---|---|
| [programmers] Lv.2 문자열 압축(c++) (0) | 2022.04.15 |
| [programmers] Lv.1 신규 아이디 추천(c++) (0) | 2022.03.01 |
| [programmers] Lv.1 로또의 최고 순위와 최저 순위(c++) (0) | 2022.02.28 |
| [programmers] Lv.1 신고 결과 받기(c++) (0) | 2022.02.25 |
댓글