본문 바로가기

CS/알고리즘

[c++]프로그래머스 숫자 문자열과 영단어

전에 틀렸던 문제 오답했다.

map을 만드는 것과 if(n.find(temp)!=n.end() ) 같은 부분은 익숙해졌는데

for (char c:s)로 문자열에서 문자 하나하나씩 반복하는 것과 isdigit()함수로 숫자와 문자를 구분하는 접근이 놀라웠다.

함수를 잘 쓰면 정말 깔끔한 코드가 나오는구나.

 

많이 배웠다.

제대로 풀 때까지 계속 오답해야지. 

 

Level 1 풀면서 Level 0과 c++ 기본서로 부족한 부분도 계속 채워야겠다.


<좋은 답>

 

#include <string>
#include <vector>
#include <map>

using namespace std;
map<string,int> n;

int solution(string s){
    string answer="";
    
    m["zero"] = 0;
    m["one"] = 1;
    m["two"] = 2;
    m["three"] = 3;
    m["four"] = 4;
    m["five"] = 5;
    m["six"] = 6;
    m["seven"] = 7;
    m["eight"] = 8;
    m["nine"] = 9;
    
    string temp = "";
    for (char c:s){
        if(isdigit(c)) answer+=c; //숫자면 answer에 넣고
        else temp+=c; //숫자가 아니면 temp에 넣는다
        
        if (n.find(temp)!=n.end()){
            answer+=to_string(n[temp]);
            temp="";
        }
    }    
    return stoi(answer);   
    
}

<내 오답>

#include <string>
#include <vector>
#include <map>
#include<algorithm>
using namespace std;

int solution(string s) {
    int answer = 0;
    
    map<int ,string>temp;
    temp[0]="zero";
    temp[1]="one";
	temp[2]="two";
	temp[3]="three";
	temp[4]="four";
	temp[5]="five";
	temp[6]="six";
	temp[7]="seven";
	temp[8]="eight";
	temp[9]="nine";
    
    for (int i=0; i<temp.size(); i++){
        string word=temp[i]; //"zero" 같은 것 word에 담기
        if ( s.find(word)!=string::npos){ //if ( s.find(word)!=s.end()){
            string n=to_string(i);
            s.replace(s.find(word),word.length(),n);
        }
        else{
            continue;
        }
    }
    
    answer=stoi(s);
    
    return answer;
}