Link : programmers.co.kr/learn/courses/30/lessons/17684
1. 문제
- 신입사원 어피치는 카카오톡으로 전송되는 메시지를 압축하여 전송 효율을 높이는 업무를 맡게 되었다. 메시지를 압축하더라도 전달되는 정보가 바뀌어서는 안 되므로, 압축 전의 정보를 완벽하게 복원 가능한 무손실 압축 알고리즘을 구현하기로 했다.LZW 압축은 다음 과정을 거친다.
- 길이가 1인 모든 단어를 포함하도록 사전을 초기화한다.
- 사전에서 현재 입력과 일치하는 가장 긴 문자열 w를 찾는다.
- w에 해당하는 사전의 색인 번호를 출력하고, 입력에서 w를 제거한다.
- 입력에서 처리되지 않은 다음 글자가 남아있다면(c), w+c에 해당하는 단어를 사전에 등록한다.
- 단계 2로 돌아간다.
단어 A B C ... X Y Z - 현재 사전에는 KAKAO의 첫 글자 K는 등록되어 있으나, 두 번째 글자까지인 KA는 없으므로, 첫 글자 K에 해당하는 색인 번호 11을 출력하고, 다음 글자인 A를 포함한 KA를 사전에 27 번째로 등록한다.
- 두 번째 글자 A는 사전에 있으나, 세 번째 글자까지인 AK는 사전에 없으므로, A의 색인 번호 1을 출력하고, AK를 사전에 28 번째로 등록한다.
- 세 번째 글자에서 시작하는 KA가 사전에 있으므로, KA에 해당하는 색인 번호 27을 출력하고, 다음 글자 O를 포함한 KAO를 29 번째로 등록한다.
- 마지막으로 처리되지 않은 글자 O에 해당하는 색인 번호 15를 출력한다.
K A 11 27: KA A K 1 28: AK KA O 27 29: KAO O 15 T O 20 27: TO O B 15 28: OB B E 2 29: BE E O 5 30: EO O R 15 31: OR R N 18 32: RN N O 14 33: NO O T 15 34: OT T T 20 35: TT TO B 27 36: TOB BE O 29 37: BEO OR T 31 38: ORT TOB E 36 39: TOBE EO R 30 40: EOR RN O 32 41: RNO OT 34 - 입력으로 TOBEORNOTTOBEORTOBEORNOT가 들어오면 다음과 같이 압축이 진행된다.
- 색인 번호123...242526
- 어피치는 여러 압축 알고리즘 중에서 성능이 좋고 구현이 간단한 LZW(Lempel–Ziv–Welch) 압축을 구현하기로 했다. LZW 압축은 1983년 발표된 알고리즘으로, 이미지 파일 포맷인 GIF 등 다양한 응용에서 사용되었다.
2. 문제의 조건
- 영문 대문자로만 이루어짐
- 1 <= msg <= 1000
더보기
3. 문제 접근
- 아이디어
문제에 주어진 사항대로 구현만 하면 됩니다. 다만, "가장 긴 문자열 w를 찾는다." 라는 개념보단 가장 긴 문자열의 자리수를 기억한다. 로 접근하시면 쉽습니다.
단어 압축 사전 중, 가장 긴 문자열을 기준으로 검색하시면됩니다.
"KAKAO" 했을 때, KA AK KAO가 등록됩니다.
이유는 현재, 최대 단어 사전의 길이는 1입니다.
현재 최대 단어 사전의 길이는 1이므로 KA는 키에 없습니다. 그래서 K는 11번째에 존재하고 K+A[K의 다음 알파벳]을 더하여 사전에 다음 idx로 등록합니다.
이제 최대 단어 사전의 길이가 2가 되었습니다.
A~Z와 KA가 등록되어있는 단어사전에
AK는 등록되어있지 않으니 A를 검색합니다.
A는 1번째에 있으므로 1를 결과에 추가하고 A + K[A의 다음 알파벳]을 더하여 사전에 등록합니다.
아직 최대 단어 사전의 길이는 2입니다.
KA는 사전에 등록되어있으므로 KA의 번째인 27을 결과에 추가하고 KA + O[KA의 다음번째 알파벳]을 사전에 추가합니다.
이제 단어 사전의 길이는 3입니다.
이제 마지막남은 O는 1자리이므로 바로 비교합니다. [만약 O뒤에 무엇가 있었다면 OXX 없으면 OX 이런식으로 비교해야합니다.]
O는 단어에 등록되었있으며 숫자는 15입니다.
4. 풀이 방법
- 단어사전을 초기화시켜줍니다. [A~Z 기본값]
- 0의 위치부터 최대 단어 길이는 1임으로 초기화해줍니다.
- 현재위치 pos가 msg보다 작을 때 까지 반복합니다.
- maxlength부터 1까지 비교를합니다. i
만약 msg[pos : pos + i]가 알파벳에 등록되어있으면 결과에 추가해주고 그 다음번째를 추가하여 단어사전에 등록하고 pos를 찾은 위치만큼 더해줍니다. 그리고 for를 벗어납니다.
5. 소스코드
cjw.git@gmail.com
'알고리즘 > programmers' 카테고리의 다른 글
76502: 괄호 회전하기 (0) | 2021.06.21 |
---|---|
12985: 예상 대진표 (0) | 2021.04.05 |
1844: 게임 맵 최단거리 (0) | 2021.04.02 |
49994: 방문 길이 (0) | 2021.04.02 |
68936: 쿼드압축 후 개수 세기 (0) | 2021.04.02 |
댓글