본문 바로가기
알고리즘 부셔버렷/ProblemSolving

[프로그래머스] 숫자 문자열과 영단어 (문제 설명, 해결 과정, 코드 전문, c++)

by Unagi_zoso 2022. 5. 27.

 

  문제 설명

 

 

본 문제는 프로그래머스의 숫자 문자열과 영단어 문제로 

"1seven2eight" 과 같이 문자열에 숫자와 숫자의 영문이 들어있고 숫자의 영문을 숫자로 치환하여 정수형으로 반환하면 됩니다.

 

 

 

 

  해결 과정

 

숫자의 명문과 그 숫자문자를 key와 value로 가지는 hashtable을 만듭니다. (unordered_map 사용하였습니다.)

본격적으로 문자열의 문자를 하나씩 가져와 알파벳인 경우에는 alpha_str이라는 string 객체에 붙여나가고 숫자인 경우에는 ans_str이라는 정답을 담는 string 객체에 담습니다. 이렇게  반복되어진 alpha_str의 값이

hashtable의 key로 존재할 때 string 객체를 반환string에 저장하고 alpha_str을 초기화하여 다음 문자부터 새로 받아 

결국엔 ans_str을 완성하게 됩니다. 반환시에는 정수형이어야하기에 정수형으로 바꾸어 반환합니다.

 

 

 

  코드 전문

 

 

#include <string>
#include <vector>
#include <unordered_map>
#include <cctype>

using namespace std;

int solution(string s) {
    int answer = 0;
    unordered_map<string, char> digi_alpha_table
                    { {"zero", '0'}, {"one", '1'}, {"two", '2'},
                    {"three", '3'}, {"four", '4'}, {"five", '5'},
                    {"six", '6'}, {"seven", '7'}, {"eight", '8'}, {"nine", '9'} };
    string ans_str{};
    string alpha_str{};
    for (auto ch : s)
    {
        if (isalpha(ch)) alpha_str += ch;
        else ans_str.push_back(ch);
        if (digi_alpha_table.find(alpha_str) != digi_alpha_table.end())
        {
            ans_str.push_back(digi_alpha_table[alpha_str]);
            alpha_str.clear();
        }
    }
    return stoi(ans_str);
}

 

 

 

 

  느낀 점 (잡설 99% , 배운점 1%(많은 편))

 

 

더보기

cctype 라이브러리의 isalpha(para)함수도 그렇고 편리한 함수가 많네요.  string의 push_back()에는 char형이 들어가고 unordered_map에 []연산자는 해당 key가 존재하지 않을 시 만들어주며 존재 시 해당하는 value를 반환해 줬습니다.  unordered_map의 find()함수가 정말 효자였습니다. 테이블에서 존재하지 않을 시엔 end()를 반환해 줍니다.

 

 

 

 

긴 글 읽어주셔서 감사합니다. 

부족한 점이 있다면 부디 알려주시면 감사하겠습니다.

 

댓글