본문 바로가기

프로그래밍/알고리즘

프로그래머스 : 숫자 문자열과 영단어 _ C++

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

#문자열 #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;
}
Recent Posts
Popular Posts