[Programmers] Level2 : [3차]압축
Question
Solution
- 단어와 번호를 담을 정렬되지 않는 map
를 사용한다, 처음 26개의 알파벳에 대해 map에 넣어준다. - string msg에 대해 for루프를 사용하되 사전에 있는 단어일 경우 계속 붙여줘야 하기 때문에 이중for루프를 사용한다.
- 루프를 도는 i에 대해서도 붙여진 문자가 많을 수록 건너뛰는 경우에 대해 처리해준다.
- 마지막 인덱스에 도달시 사전에 등록되어 있는 경우에 대한 처리를 해준다.
Cord
#include <vector>
#include <string>
#include <unordered_map>
using namespace std;
vector<int> solution(string msg)
{
vector<int> answer;
unordered_map<string, int> dic; //(알파벳, 번호)
int idx;
for (idx = 0; idx < 26; ++idx)
{
string alpha = "";
alpha += (65 + idx);
dic.insert({ alpha, idx + 1 });
}
for (int i = 0; i < msg.size(); ++i)
{
string temp = "";
for (int j = i; j < msg.size(); ++j)
{
temp += msg[j];
// 사전에 있는 문자면 + c 하기
if (dic.find(temp) != dic.end())
{
// 마지막 도달시 처리
if (j == msg.size()-1)
{
answer.push_back(dic[temp]);
return answer;
}
}
// 사전에 없으면 w에 대한 색인 번호 출력, w+c 등록
else
{
dic.insert({ temp, ++idx }); // 사전에 등록
i = j-1;
// 가장 뒤에있는 문자 빼고 색인번호 출력
temp.pop_back();
answer.push_back(dic[temp]);
break;
}
}
}
return answer;
}