본문 바로가기

problem solving

[프로그래머스]압축문자열

난이도: 하?

#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
vector<int> solution(string msg) {
    vector<int> answer;
 
    vector<string> dict;
    //1번부터 시작하기 위해 더미값 삽입
    dict.push_back("");
    //A~Z 알파벳 삽입
    for(int i = 0; i < 26; i++) {
        char alphabet_c = char('A' + i);
        string alphabet_s = "";
        alphabet_s = alphabet_s + alphabet_c;
        dict.push_back(alphabet_s);
    }
 
    //position은 사전 위치를 저장
    int position;
    bool flag = false;
    string check_str, msg_str, add_str;
    for (int i = 0; i < msg.length(); i++) {
        position = 0;
        check_str = "", msg_str = "", add_str = "";
        flag = false;
        while(!flag && i < msg.length()) {
            msg_str = msg_str + msg[i];
            flag = true;
            for(int u = 0; u < dict.size(); u++) {
                //msg_str과 같은 문자열을 찾아서 사전에 존재하는지 확인하고,
                //존재한다면 position 값 갱신
                //존재하지 않는다면 while 문을 빠져나온다.
                if(msg_str == check_str + dict[u]) {
                    for(int k = 0; k < dict.size(); k++) {
                        if(dict[k] == msg_str) {
                            position = k;
                            i++;
                            flag = false;
                        }
                    }
                    check_str = msg_str;
                    break;
                }
            }
        }
        answer.push_back(position);
        //i를 증가시키지 않았을 때 
        if(msg_str.length() > 1) {
            i--;
        }
 
        //사전에 현재 입력이 존재하지 않는다면 추가
        for(int j = 0; j < dict.size(); j++) {
            if(dict[j] == check_str) {
                break;
            }
            if(j == dict.size() - 1) {
                dict.push_back(check_str);
            }
        }
    }
 
    // for(int j = 0; j < dict.size(); j++) {
    //     cout << dict[j] << "\n";
    // }
    return answer;
}
cs