문제
LZW 압축은 다음 과정을 거친다.
- 길이가 1인 모든 단어를 포함하도록 사전을 초기화한다.
- 사전에서 현재 입력과 일치하는 가장 긴 문자열 w를 찾는다.
- w에 해당하는 사전의 색인 번호를 출력하고, 입력에서 w를 제거한다.
- 입력에서 처리되지 않은 다음 글자가 남아있다면(c), w+c에 해당하는 단어를 사전에 등록한다.
- 단계 2로 돌아간다.
압축 알고리즘이 영문 대문자만 처리한다고 할 때, 사전은 다음과 같이 초기화된다. 사전의 색인 번호는 정수값으로 주어지며, 1부터 시작한다고 하자.
색인 번호 | 1 | 2 | 3 | ... | 24 | 25 | 26 |
단어 | A | B | C | ... | X | Y | Z |
예를 들어 입력으로 KAKAO가 들어온다고 하자.
- 현재 사전에는 KAKAO의 첫 글자 K는 등록되어 있으나, 두 번째 글자까지인 KA는 없으므로, 첫 글자 K에 해당하는 색인 번호 11을 출력하고, 다음 글자인 A를 포함한 KA를 사전에 27 번째로 등록한다.
- 두 번째 글자 A는 사전에 있으나, 세 번째 글자까지인 AK는 사전에 없으므로, A의 색인 번호 1을 출력하고, AK를 사전에 28 번째로 등록한다.
- 세 번째 글자에서 시작하는 KA가 사전에 있으므로, KA에 해당하는 색인 번호 27을 출력하고, 다음 글자 O를 포함한 KAO를 29 번째로 등록한다.
- 마지막으로 처리되지 않은 글자 O에 해당하는 색인 번호 15를 출력한다.
현재 입력(w) | 다음 글자(c) | 출력 | 사전 추가(w+c) |
K | A | 11 | 27: KA |
A | K | 1 | 28: AK |
KA | O | 27 | 29: KAO |
O | 15 |
이 과정을 거쳐 다섯 글자의 문장 KAKAO가 4개의 색인 번호 [11, 1, 27, 15]로 압축된다.
주어진 문자열을 압축한 후의 사전 색인 번호를 배열로 출력하라.
문제조건
입력으로 영문 대문자로만 이뤄진 문자열 msg가 주어진다. msg의 길이는 1 글자 이상, 1000 글자 이하이다.
풀이
조금 더 찾기 쉽도록 사전의 자료구조로 map을 사용하였다. 사전에 있는 가장 긴 w를 찾기 위해 주어진 문자열을 뒤에서부터 검색해 나갔다. 이 w 값이 남겨진 문자열의 길이와 같지 않다면 c를 더하여 사전에 추가하였다.
코드
#include <string>
#include <vector>
#include <map>
using namespace std;
map <string, int> dictionary;
vector<int> answer;
string zip(string str){
string w = str;
int c = str.length()-1;
for(int i=str.length()-1; i>=0; i--){
// 가장 긴 w 찾기
if(dictionary.find(w)!=dictionary.end()){
c = i;
break;
}
else{
w = w.substr(0, i);
}
}
if(c<str.length()-1){
string wc = w + str[c+1];
dictionary.insert({wc, dictionary.size()+1});
}
answer.push_back(dictionary.find(w)->second);
return str.substr(c+1);
}
vector<int> solution(string msg) {
for(int i=0; i<26; i++){
string str = "";
str+=(char)('A'+i);
dictionary.insert({str, i+1});
}
string s = zip(msg);
while(s.length()>0){
s = zip(s);
}
return answer;
}
반응형
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 오픈채팅방 (level2, js) (0) | 2021.10.11 |
---|---|
[프로그래머스] 키패드 누르기 (level1, js) (0) | 2021.10.05 |
[프로그래머스] 캐시 (level2, c++) (0) | 2021.09.09 |
[프로그래머스] 프렌즈4블록 (level2, c++) (0) | 2021.09.08 |
[프로그래머스] 후보키 (level2, c++) (0) | 2021.09.07 |