[프로그래머스/Java] 압축

2025. 5. 30. 13:54·Problem Solving/프로그래머스

문제

https://school.programmers.co.kr/learn/courses/30/lessons/17684

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

LZW는 데이터를 압축하는 알고리즘이다. LZW는 다음과 같은 과정을 거쳐서 압축한다.

  1. 길이가 1인 모든 단어를 포함하여 사전을 초기화한다.
  2. 사전에서 현재 입력과 일치하는 가장 긴 문자열 `w`를 찾는다.
  3. `w`에 해당하는 사전의 인덱스를 출력하고, 입력에서 `w`를 제거한다.
  4. 입력에서 처리되지 않은 다음 글자(`c`)가 남아있다면 `w+c`를 사전에 등록한다.
  5. 2단계로 돌아간다.

문제에서는 영문 대문자만 처리한다. 때문에 사전은 A~Z로 초기화 되어있다.

문자열 `msg`이 주어지면 LZW 알고리즘을 적용한 사전 인덱스 출력 결과를 반환해야 한다.

 

풀이

사전을 A~Z로 초기화하는 방법에서 조금 헤맸는데, 앞으로는 `(char) ('A' + i)`를 반복해서 넣어주는 방식을 사용해야겠다.

항상 문제를 제대로 읽어야 한다고 느끼는데, 이번에도 인덱스가 중복을 허용하지 않는 줄 착각하고, Set을 사용하려다 계속 실패했다. 

💡Java에서 입력 순서가 보장되는 Set은 `LinkedHashSet` 구현체다.

 

처음에는 이중 for문을 사용해서 `j`를 늘려가며 인덱싱해보려 시도했으나 도중에 꼬이는 바람에 실패했다. 그래서 정돈된 코드를 찾아서 풀었다. 아직 인덱싱하는 방법에 서툰 것 같아 인덱싱 시뮬레이션을 많이 해봐야겠다고 느꼈다.

 

⚠`substring` 메서드의 두 번째 인자는 해당 인덱스는 포함하지 않으니 주의할 것.

 

코드

import java.util.*;

class Solution {
    public List<Integer> solution(String msg) {
        // 인덱스 초기화
        List<String> dictionary = new ArrayList<>();
        dictionary.add("");
        for (int i = 0; i < 26; i++) {
            dictionary.add(String.valueOf((char) ('A' + i)));
        }
        
        List<Integer> index = new ArrayList<>();
        int start = 0;
        while (start < msg.length()) {
            int end = start + 1;
            // 사전에 없는 단어가 나올 때까지 문자열 길이를 늘려가며 탐색
            while (end <= msg.length() && dictionary.contains(msg.substring(start, end))) {
                end++;
            }
            
            // 사전에 있는 현재 단어까지 인덱스에 추가
            String w = msg.substring(start, end - 1);
            index.add(dictionary.indexOf(w));
            
            // 다음 글자를 추가하여 사전에 추가
            if (end <= msg.length()) {
                String wc = msg.substring(start, end);
                dictionary.add(wc);
            }
            
            start = end - 1;
        }
                    
        return index;
    }
}
저작자표시 비영리 동일조건 (새창열림)

'Problem Solving > 프로그래머스' 카테고리의 다른 글

[프로그래머스/JavaScript] 주차 요금 계산  (0) 2025.07.01
[프로그래머스/Java] 다트 게임  (2) 2025.05.30
[프로그래머스/Java] k진수에서 소수 개수 구하기  (2) 2025.05.29
[프로그래머스/Java] 실패율  (2) 2025.05.28
[프로그래머스/Java] N진수 게임 (feat. Java 진법 변환)  (1) 2025.05.23
'Problem Solving/프로그래머스' 카테고리의 다른 글
  • [프로그래머스/JavaScript] 주차 요금 계산
  • [프로그래머스/Java] 다트 게임
  • [프로그래머스/Java] k진수에서 소수 개수 구하기
  • [프로그래머스/Java] 실패율
friend5hip
friend5hip
개발 관련 지식이나 기록을 남기고 있습니다.
  • friend5hip
    friend5hip
    friend5hip
  • 전체
    오늘
    어제
    • 분류 전체보기 (60)
      • 컴퓨터공학 (2)
        • 자료구조 (0)
        • 알고리즘 (1)
        • 데이터베이스 (1)
      • Problem Solving (42)
        • BOJ (25)
        • 프로그래머스 (15)
      • 언어 (2)
        • JavaScript (2)
      • 라이브러리 (12)
        • React (12)
      • 개발 (2)
      • 기타 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    누적 합
    vite
    dp
    백트래킹
    BFS
    JavaScript
    그리디
    맵
    매개 변수 탐색
    완전 탐색
    프로그래머스
    정렬
    react
    문자열
    투 포인터
    집합
    dfs
    intersection observer
    수학
    N과 M
    삼성 sw 역량테스트
    순열
    이분 탐색
    백준
    코드트리
    소수 판별
    시뮬레이션
    구현
    java
    구간 합
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
friend5hip
[프로그래머스/Java] 압축
상단으로

티스토리툴바