[프로그래머스] (C++) 숫자 문자열과 영단어 <2021 카카오 채용연계형 인턴십>

winluck·2023년 7월 5일
1

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

문제

일부 숫자가 영단어로 바뀐 문자열을 원래 숫자로 변환하는 문제이다. 카카오는 문자열을 참 좋아하는 것 같다.

제한사항

문제에서 추출할 수 있는 정보는 다음과 같다.

  • s의 길이는 1~50이며, 올바른 입력만 주어진다.(망가진 영단어가 없다는 얘기)
  • 각 영단어를 그에 대응하는 숫자로 매칭해주어야 한다.

입출력

각 문자열이 특정 숫자에 일대일 대응하는 상황이다.
Key(문자열)-Value(숫자)의 구성을 가진 Map 자료구조를 떠올릴 수 있다.

먼저 Map에 각 Key에 알맞은 Value를 부여한다.


이후 map에 존재하는 Key임을 탐지하기 위한 파싱용 문자열 tmp를 선언하고, 숫자인지 아닌지를 판단하는 조건문을 추가하기만 하면 된다. (마지막이 Key인 경우에 대응해 for문 이탈 후 한번 더 체크해주었다.)반환값이 숫자이므로 stoi 함수로 마무리해주어야 한다.

소스 코드

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

// 19분 16초

using namespace std;

int solution(string s) {
    int answer = 0;
    string answerList = "";
    map<string, char> m;
    
    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 tmp = "";
    for(int i=0; i<s.size(); i++){
        if(m.count(tmp) >= 1){ // 숫자랑 매칭되는 문자열 발견
            answerList += m[tmp];
            tmp = "";
        }
        
        if(s[i] >= '0' && s[i] <= '9') answerList += s[i];
        else tmp += s[i];
    }
    
    if(m.count(tmp) >= 1){ // 마지막 부분이 문자열인 경우
        answerList += m[tmp];
    }
    
    answer = stoi(answerList);    
    return answer;
}

교훈

  • 조건문 흐름 제어를 더 정교하게 하자. 디버깅하는데 시간이 꽤 걸렸다.
  • map, set, priorityqueue 등 여러 자료구조의 존재를 항상 인지하자.
profile
Discover Tomorrow

0개의 댓글