본문 바로가기
개발 노트/백준, 프로그래머스 풀이

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

by tokkiC 2022. 6. 22.

맵을 이용해서 푸는 문제인건 바로 알 수 있었다

하지만 매칭되지 않으면 빈문자열이 나온다는 점과 매칭되지 않으면 문자를 변수에 저장하고 다음 문자와 합쳐서

합쳐진 변수로 맵과 비교하는 것을 반복하는 점, map 을 외부 함수로 선언 시, 맵을 참조 가능하려면 함수 호출을

해야 되는 점... 많이도 몰랐다

맵은 외부에서 함수로 따로 초기화 외에도 함수 내부에서 초기화 할 수도 있다 

#include <bits/stdc++.h>

using namespace std;

unordered_map<string, string> mapi;

void cov(){						// mapi 을 초기화한 참조데이터를 함수로 따로 만들어 두었다
    mapi["zero"]="0";			// 이 경우 mapi 이 전역 변수 이므로
    mapi["one"]="1";			// 여러 함수에서 호출해서 mapi을 사용가능하다
    mapi["two"]="2";
    mapi["three"]="3";
    mapi["four"]="4";
    mapi["five"]="5";
    mapi["six"]="6";
    mapi["seven"]="7";
    mapi["eight"]="8";
    mapi["nine"]="9";
}

int solution(string s) {
    int answer = 0;
    string ret="";	// 문자 임시로 담아 map에 비교할 그릇
    string tok="";	// 완성 문자열
    cov();			// mapi 를 사용하기 위해 참조할 데이터 호출
    
    // mapi["zero"]="0";		// 외부 map 참조 함수 cov 호출 없이
    // mapi["one"]="1";			// 이렇게 사용 함수 내부에 초기화해도 된다
    // mapi["two"]="2";
    // mapi["three"]="3";
    // mapi["four"]="4";
    // mapi["five"]="5";
    // mapi["six"]="6";
    // mapi["seven"]="7";
    // mapi["eight"]="8";
    // mapi["nine"]="9";
    
    for(int i=0; i<s.length(); i++){
        if(isdigit(s[i])){
           tok+=s[i]; 
        } else {    // 숫자가 아니면 아래 실행
            ret+=s[i]; 
            if(mapi[ret] != ""){    // ret 이 mapi에 있다면 (없으면 빈문자열임) 
                tok+=mapi[ret];		// 있는 것이니 그 value 를 완성 문자열에 더하고
                ret="";				// ret 을 초기화 해준다
            }                         
        }
    }
    answer=stoi(tok);		// 문자열을 정수로 형변환
    
    return answer;
}

댓글