본문 바로가기
Beakjoon&프로그래머스/Java

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

by 현장 2026. 3. 30.

-Code

import java.util.*;

class Solution {
    public int[] solution(String msg) {
        // 기본 사전 생성
        Map<String, Integer> dict = new HashMap<>();
        for (int i = 1; i < 27; i++) {
            char now = (char) ('A' + i - 1);
            dict.put(String.valueOf(now), i);
        }
        // 압축 시작
        List<Integer> answer = new ArrayList<>();
        int idx = 0;
        while(idx < msg.length()) {
            String now = "";
            // 사전에 있는 가장 긴 단어 찾기
            while (idx < msg.length() && dict.containsKey(now + msg.charAt(idx))) {
                now += msg.charAt(idx);
                // 필요한 만큼 인덱스 전진
                idx++; 
            }
            // 색인 번호 저장
            answer.add(dict.get(now));
            // 현재 위치가 길이보다 작으면 새로운 단어 추가
            if (msg.length() > idx) {
                int val = dict.size() + 1;
                dict.put(now + msg.charAt(idx), val);
            }
        }
        // 리스트를 배열로 변환해 반환
        return answer.stream()
                .mapToInt(Integer::intValue).toArray();
    }
}

푸는데 아래와 같이 2개의 실수가 있었습니다.

1. 예시 설명을 잘못 이해해서 1 단어씩 이동하면서 계속 검사하는 줄 알아서 이상한 입출력이 나오게 되었습니다.

2. 문자열을 붙이며 검사해야 해서 StringBuilder를 사용해 해결하려 했으나 코드가 지저분해져 꼬이게 되었습니다.

 

그래서 첫번째 문제는 문제 이해를 어딜 잘못했는지 좀 찾아보니 index를 검사한 길이만큼 이동시키면 되는 문제여서 for문으로 하나씩 이동했던 것을 while문으로 길이 안에 있어야 적용하도록 바꾸었고 StringBuilder는 제거하고 그냥 String을 사용해 해결했습니다.