Algorithm/프로그래머스

[프로그래머스] 압축 (Java)

Carroti 2022. 11. 14. 16:56

문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

알고리즘

해시맵

 

풀이

해시맵으로 사전을 구현한다.

"A": 1, "B":2 ,..., "Z": 26 으로 해시맵을 초기화하고, 사전의 다음 색인 번호를 나타낼 index를 27로 초기화한다.

 

msg가 빈 문자열이 될 때까지

1. w를 얻는다.

- 문자열을 탐색하며 해시맵에 없는 문자열이 나올 때까지 문자열에 문자를 하나씩 붙인다.

 

2. 해시맵에서 w의 value를 찾아 answer에 삽입한다.

3. msg에서 w를 삭제한다.

4. 문자열이 남아있다면 첫 글자를 w에 추가하여 index를 value로 해시맵에 삽입하고 index를 1 늘린다.

 

문자열을 수정하는 연산이 많기 때문에 StringBuilder를 사용한다.

 

 

코드

import java.util.*;

class Solution {
    public ArrayList<Integer> solution(String msg) {
        ArrayList<Integer> answer = new ArrayList<>();
        
        Map<String, Integer> map = new HashMap<>();
        for(int i=1; i<=26; i++) {
            map.put(String.valueOf((char)('A' + i - 1)), i);
        }
        
        int index = 27;
        StringBuilder sb = new StringBuilder(msg);
        StringBuilder longest = new StringBuilder();
        int count = 0;
        while(sb.length() > 0) {
            StringBuilder w = getW(sb, map);
            answer.add(map.get(w.toString()));
            sb.delete(0, w.length());
            
            if(sb.length() > 0)
                map.put(w.append(sb.charAt(0)).toString(), index++);
        }
        
        return answer;
    }
    
    public StringBuilder getW(StringBuilder sb, Map<String, Integer> map) {
        StringBuilder w = new StringBuilder();
        
        for(int i=1; i<=sb.length(); i++) {
            if(map.containsKey(sb.substring(0, i)))
                w.append(sb.charAt(i-1));
            else break;
        }
        
        return w;
    }
}