programmers.co.kr/learn/courses/30/lessons/17684
<풀이>
1. 문자열을 주어진 LZW 압축 과정에 따라 압축한다.
2. 압축이 모두 완료된 후, 색인 번호들을 반환한다.
<해법>
문제를 푸는데 특별한 아이디어가 필요하지 않습니다. 주어진 LZW 압축 과정을 정확하게 구현하는 것이 문제의 핵심이라고 생각합니다. 저는 주어진 압축 과정을 최대한 똑같이 구현하는데 초점을 두어서 구현하였습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//사전
vector<string> dict;
//메시지 안에 같은 단어가 있는지 확인
bool hasSameVocab(string msg, string vocab) {
for (int i = 0; i < vocab.length(); i++) {
if (vocab[i] != msg[i]) {
return false;
}
}
return true;
}
vector<int> solution(string msg) {
vector<int> answer;
/*
1. 사전 만들기
*/
dict.push_back("#");
for (int i = 0; i < 26; i++) {
char alpha = 'A' + i;
dict.push_back(string(1, alpha));
}
/*
2번 ~ 5번 반복
*/
while (true) {
/*
2. 사전에서 입력과 일치하는 가장 긴 문자열 찾기
*/
string removeVocab = ""; //지워지는 단어
int index; //사전 색인
//사전을 모두 탐색
for (int i = 1; i < dict.size(); i++) {
string vocab = dict[i];
//메시지안에 같은 단어가 있고, 길이가 더 긴 단어 지우기
if (hasSameVocab(msg, vocab) && vocab.length() > removeVocab.length()) {
removeVocab = vocab;
index = i;
}
}
/*
3. 색인 번호 담고, 메시지에서 해당 단어 지우기
*/
answer.push_back(index);
msg = msg.substr(removeVocab.length());
/*
4. 다음 글자가 남아 있을 경우, 다음 글자 포함해서 사전 등록
*/
if (msg.empty()) {
break;
}
else {
dict.push_back(removeVocab + msg[0]);
}
}
//결과 반환
return answer;
}
|
구현에 대해서 알아볼 수 있는 문제였습니다.
'알고리즘 문제풀이 > 프로그래머스' 카테고리의 다른 글
[C++] 프로그래머스 - 메뉴 리뉴얼 (0) | 2021.01.31 |
---|---|
[C++] 프로그래머스 - 신규 아이디 추천 (0) | 2021.01.31 |
[C++] 프로그래머스 - 방금그곡 (0) | 2021.01.19 |
[C++] 프로그래머스 - 다트 게임 (0) | 2021.01.16 |
[C++] 프로그래머스 - 비밀지도 (0) | 2021.01.16 |