問題
LZW 압축은 다음 과정을 거친다.
길이가 1인 모든 단어를 가지는 사전을 생성한다.
현재 위치에서 사전과 가장 길게 일치하는 문자열 s를 찾는다.
문자열 s의 사전 색인 번호를 출력한다.
다음 글자가 없으면 종료한다.
s+다음 글자를 사전에 등록한다.
현재 위치를 다음 글자로 바꾼다.
2번 작업으로 돌아간다.
압축 알고리즘이 영문 대문자만 처리한다고 할 때, 사전은 다음과 같이 초기화된다. 사전의 색인 번호는 정수값으로 주어지며, 1부터 시작한다고 하자.
색인 번호 | 1 | 2 | 3 | ... | 24 | 25 | 26 |
|---|---|---|---|---|---|---|---|
단어 | A | B | C | ... | X | Y | Z |
예를 들어 입력으로 a = "BANANA"가 들어온다고 하자.
현재 위치 a[0]='B'에서부터 사전에서 가장 길게 일치하는 문자열 s는 "B"이고 이에 해당하는 색인 번호 2를 출력한다. 이후 s+다음글자인 "BA"를 사전에 27번째로 등록한다.
현재 위치 a[1]='A'에서부터 사전에서 가장 길게 일치하는 문자열 s는 "A"이고 이에 해당하는 색인 번호 1을 출력한다. 이후 s+다음글자인 "AN"를 사전에 28번째로 등록한다.
현재 위치 a[2]='N'에서부터 사전에서 가장 길게 일치하는 문자열 s는 "N"이고 이에 해당하는 색인 번호 14를 출력한다. 이후 s+다음글자인 "NA"를 사전에 29번째로 등록한다.
현재 위치 a[3]='A'에서부터 사전에서 가장 길게 일치하는 문자열 s는 "AN"이고 이에 해당하는 색인 번호 28을 출력한다. 이후 s+다음글자인 "ANA"을 사전에 30번째로 등록하고, 현재 위치를 다음 글자 s[5]=A로 바꾼다.
현재 위치 a[5]='A'에서부터 사전에서 가장 길게 일치하는 문자열 s는 "A"이고 이에 해당하는 색인 번호 1을 출력한다. 이후 다음글자는 없으므로 끝낸다.
入力
1,000자 이하의 영문 대문자로 이루어진 문자열이 한 줄로 주어진다.
出力
문자열을 LZW 압축한 결과를 공백을 구분으로 한 줄로 출력한다.
例題
BANANA
2 1 14 28 1