[C++로 풀이] 압축⭐⭐

Date:     Updated:

카테고리:

태그:

📌 압축

난이도 ⭐⭐

🚀 문제

image

image


🚀 내 풀이 ⭕

#include <string>
#include <vector>
#include <unordered_map>

using namespace std;

vector<int> solution(string msg) {
    vector<int> answer;
    // Key를 A~Z, 이에 대한 Value를 각각 1~26으로.
    unordered_map<string, int> dic;
    for(int i = 0; i < 26; i++){
        char c = 'A' + i;
        dic[string(1, c)] = i + 1;
    }
    
    string str = "";
    int number = 27;
    for(int i = 0; i < msg.length(); ){
        str += msg[i]; // str.push_back(msg[i]);
        if (dic.find(str) == dic.end()){
            dic[str] = number++;
            str.pop_back();
            answer.push_back(dic[str]);
            str = "";
        }
        else i++;
    }
    answer.push_back(dic[str]);
    
    return answer;
}
  • dic.find(str) != dic.end()
    • 사전에 있다면 다음 문자를 붙인 것도 사전에 있나 확인하러 다음 반복으로 가야 한다. i++
  • dic.find(str) == dic.end()
    • 사전에 없다면 (KAO가 사전에 없다면)
      • KAO 여태 만든 해당 문자열을 사전에 추가하고
      • KA 현재 문자 msg[i] 를 뺀, 즉 그 이전까진 사전에 있었던 그 문자열을 출력한다. 다음 반복으로 갈 필요 없이 다시 msg[i]를 시작점으로 이어붙이기 시작해야하므로 이땐 i++ 하지 않는다. 이제 O 부터 다시 시작해야 함.
  • for문이 끝나기 바로 저의 마지막 문자열은 무조건 else에 걸리기 때문에 (“KAO”가 사전에 있어도, 혹은 없어도, 마지막 i은 else 에 걸리게 되어있음) answer에 추가되지 못했으므로 마지막에 for문 빠져나온 후 추가 해준다.


✈ string 과 char

string 에 char 붙이기

string str = "";
str += msg[i];

stringchar 못 붙일 줄 알았는데 붙이는게 가능했다!

str.push_back(msg[i]);

stirngpush_backchar를 인수로 받는다. 이렇게 한 문자씩 string 뒤에 이어 붙일 수 있게 된다.


char를 string으로 변환하기

    char c = 'A' + i;
    dic[string(1, c)] = i + 1; // 익명 객체

    string str(1, 'A');

A 이런 한 문자(char)를 string으로 변환하고 싶을 땐 생성자 인수를 (1, char) 이런식으로 넘기면 된다. (string 의 사이즈는 1 + 해당 문자로 초기화)



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Programmers 카테고리 내 다른 글 보러가기

댓글 남기기