https://school.programmers.co.kr/learn/courses/30/lessons/81301
#문자열 #lv.1
회고
✔ 문자열
문제를 해결하기 위해선 영어로 입력 받은 문자열을 숫자로 변경해주는 작업이 필요로 했다.
해당 작업은 string 헤더의 replace 함수를 통해 해결 할 수 있어서 그리 어렵진 않았다.
그러나 답을 제출하니 3개의 테스트 케이스가 통과되지 못했고, 고민해봐도 뭐가 문제인지 모르겠어서 다른 분이 올려둔 테스트 케이스를 찾다 1oneoneone 의 중복되는 숫자 문자열을 알게되었다.
나 역시 해당 테스트 케이스가 오답이 나온 것을 통해 어느부분에 문제가 있었던건지 알 수 있었고, 해당 부분은 문자열의 모든 부분 문자열 바꾸기를 통해 해결해줬다.
https://www.techiedelight.com/ko/replace-all-occurrences-of-a-substring-in-string-in-cpp/
이 글을 참고하였다.
나중에 기억하기 쉽게 풀어서 설명해보자면,
while문을 돌면서 원본 문자열에 일치하는 문자열이 있는 경우 해당 문자열을 숫자로 변경해주고 pos 값을 1 증가시켜 다음 차례의 문자열을 검사해준다.
만약, 일치하는 문자열이 없을 경우 쓰레기값을 리턴해서 탈출하게 만들어줬다.
해당 문제를 풀면서 C++ string의 여러 함수를 다시 한번 깊게 생각 해 볼 수 있는 시간을 가질 수 있었다.
다음에 find, replace, to_sting, stoi 등 문자열 함수를 정리해보는 것도 좋을 것 같다.
✔ String to Int
string 타입의 숫자를 정수로 변환시켜주는 작업은 cmath 헤더의 pow (제곱) 함수를 사용하여 해줬다.
몇번 해본 적이 있었는데 문제 풀 때 기억이 안나서 여러 방법을 시도하면서 풀었다.
for (int i = 0; i < s.length(); i++) {
answer += (s[i] - '0') * pow(10,(s.length() - i - 1));
}
나중에 까먹지 않도록 ... 그리고 다른 분들은 어떤 방식으로 변환시켰는지 확인해서 개선시켜봐야겠다.
아무튼 이 문제는 위의 두가지 문제점 때문에 약 1시간 정도 걸려서 푼것같다. 🙃
코드
#include <string>
#include <vector>
#include <cmath>
using namespace std;
int solution(string s) {
int answer = 0;
pair<string, int> dict[10] = { { "zero",0 }, { "one",1 }, { "two",2 } ,{ "three",3 } ,
{ "four",4 },{ "five",5 },{ "six",6 },{ "seven",7 },{ "eight",8 },{ "nine",9 } };
for (int i = 0; i <= 9; i++) {
size_t pos = 0;
if (s.find(dict[i].first) != string::npos) {
while (true) { //원본 문자열 내 모든 일치하는 문자열 변경
pos = s.find(dict[i].first, pos);
if (pos == std::string::npos) {
break;
}
s.replace(s.find(dict[i].first), dict[i].first.length(), to_string(dict[i].second));
pos++;
}
}
}
for (int i = 0; i < s.length(); i++) {
answer += (s[i] - '0') * pow(10,(s.length() - i - 1));
}
return answer;
}
'프로그래밍 > 알고리즘' 카테고리의 다른 글
Softeer : 금고털이 _ C++ (0) | 2022.10.28 |
---|---|
프로그래머스 : JadenCase 문자열 만들기 _ C++ (0) | 2022.10.27 |
프로그래머스 : 모의고사 _ C++ (0) | 2022.10.26 |
프로그래머스 : 완주하지 못한 선수 _ C++ (0) | 2022.10.26 |
프로그래머스 : 콜라 문제 _ C++ (0) | 2022.10.26 |