프로그래머스(Programmers)

숫자 문자열과 영단어

cosmohoo 2021. 12. 6. 20:52
반응형

문제 설명 ( 사진이 귀여운게 킹받는다...)

 

 

 

 

제한사항

  • 1 ≤ s의 길이 ≤ 50
  • s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

입출력 예

sresult

"one4seveneight" 1478
"23four5six7" 234567
"2three45sixseven" 234567
"123" 123

입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • 문제 예시와 같습니다.

입출력 예 #3

  • "three"는 3, "six"는 6, "seven"은 7에 대응되기 때문에 정답은 입출력 예 #2와 같은 234567이 됩니다.
  • 입출력 예 #2와 #3과 같이 같은 정답을 가리키는 문자열이 여러 가지가 나올 수 있습니다.

입출력 예 #4

  • s에는 영단어로 바뀐 부분이 없습니다.

제한시간 안내

  • 정확성 테스트 : 10초

 

=> 단순 구현 문제입니다. 

=> 주어진 string s에서 숫자로 주어진 구역은 바로 number에 push_back 하였습니다. 

=> 문자로 주어진 구역은 첫 번째 숫자와 두 번째 숫자로 비교하여 알맞은 숫자를 찾아 number에 push_back 하였습니다. 

=> ONE , TWO, THREE ,,... 의 경우 첫 번째, 두 번째 글자까지 똑같은 경우가 없으므로 2번째 글자까지만 확인하면 됩니다. 

=> 해당하는 숫자를 찾았을 경우 더 찾는 것은 시간낭비이기 때문에 for문의 break를 걸었습니다. 

=> 문제에서는 Int형 answer 를 원했으므로, stoi 함수를 사용하여 원하는 값을 반환하였습니다. 

 

#include <string>
#include <vector>
#include <iostream> 


using namespace std;

vector<string> arr={"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

int solution(string s) {
    int answer = 0;
    string number;
    int sSize = s.size(); 
    
    for(int i=0; i<sSize; i++)
    {
       if(s[i] >= '0' && s[i] <= '9' )
       {
           number.push_back(s[i]);
       }
        
        else
        {
            for(int j=0; j<10; j++)
            { 
               if((arr[j][0] == s[i]) && (arr[j][1] == s[i+1]) ) //일치하는 단어 찾음
                {
                   char tmp = j+ '0';
                    number.push_back(tmp);
                    i += arr[j].size() -1;
                    break;
                }
                
            }
        }
        
    }
    answer=stoi(number);
    return answer;
}

 

반응형