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

YH·2023년 12월 19일
0

문제

숫자 문자열과 영단어 : 문제 링크


문제 분석

  • 네오와 프로도가 숫자놀이를 하고 있다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드르 건네주면 프로도는 원래 숫자를 찾는 게임이다. 다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시이다.
  • 1478 -> "one4seveneight"
  • 234567 -> "23four5six7"
  • 10203 -> "1zerotwozero3"
  • 이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어진다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성. 참고로 각 숫자에 대응되는 영단어는 다음 표와 같다.
숫자영단어
0zero
1one
2two
3three
4four
5five
6six
7seven
8eight
9nine
  • 제한 사항
  • 1 <= s의 길이 <= 50
  • s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않는다.
  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어진다.
  • 벡터내에 문자열이 존재하는 확인하기 위해 find() 함수를 사용하므로 algorithm 헤더를 include
  • 문자열 s를 숫자 형태의 문자로 변환하여 저장할 문자열 answer과 영단어를 임시로 저장할 tmp를 초기화. 문자열형 벡터 num에 "zero"부터 "nine"까지 넣고 저장. for loop를 통해 문자열 s의 첫번째부터 마지막 원소까지 순환하고, if문을 사용하여 '0'부터 '9'일 경우 문자 그대로 answer에 저장하고, 이외의 경우 영어 소문자 이므로 else문을 사용하여 tmp에 문자를 저장. 또다른 if문과 find() 함수를 사용하여 num내에 문자열 tmp에 저장된 문자열이 존재하는지 확인하고 있다면, 찾은 문자열의 인덱스를 문자화하여 answer에 저장 후 tmp를 초기화. 이 과정을 반복하고 loop 탈출 후, 최종적으로 저장된 answer을 stoi() 함수를 통해 정수화 하여 return

1. vector내에 해당 원소가 존재하는지 확인
=> find(v.begin(), v.end(), 찾을 대상)
1) return 값이 v.end()인 경우 => 해당 원소가 존재하지 않음
2) return 값이 v.end()가 아닌 경우 => 해당 원소가 존재함
2. vector내에서 해당 원소가 위치하는 인덱스 찾기
=> find(v.begin(), v.end(), 찾을 대상) - v.begin


풀이

#include <vector>
#include <string>
#include <algorithm>

using namespace std;

int solution(string s) {
    string answer = "", tmp = "";
    vector<string> num = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
    
    for(int i = 0; i < s.size(); ++i) {
        if('0' <= s[i] && s[i] <= '9') answer += s[i];
        else tmp += s[i];
        if(find(num.begin(), num.end(), tmp) != num.end()) {
            answer += to_string(find(num.begin(), num.end(), tmp) - num.begin());
            tmp = "";
        }
    }
    return stoi(answer);
}
profile
Keep Recycling Your Dreams

0개의 댓글