코딩 테스트/프로그래머스

프로그래머스 - 압축 문제 (자바)

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

 

코딩테스트 연습 - [3차] 압축

TOBEORNOTTOBEORTOBEORNOT [20, 15, 2, 5, 15, 18, 14, 15, 20, 27, 29, 31, 36, 30, 32, 34]

programmers.co.kr

사실 본인은 아래 코드 처럼 깔끔하게 코딩을 하지 못했다. 풀고나서 다른 사람 풀이를 보고 정리한 상태이다.

간단하게 이해해보자면 기존 알파벳을 전부 등록하고 문자열을 2개 씩 붙혀가면서 비교한다.

과정에서 고려해야하는 것은 반복문 중에 index가 마지막 위치까지 오는 경우이다.

import java.util.ArrayList;
import java.util.HashMap;

// 프로그래머스 압축 문제
class Compression {

    static HashMap<String, Integer> map = new HashMap<>();
    static ArrayList<Integer> list = new ArrayList<>();
    static char[] arr;
    static int idx = 1;
    public int[] solution(String msg) {
        for(int i = 0; i < 26; i++){
            map.put(String.valueOf((char)('A' + i)), i + 1);
        }
        arr = msg.toCharArray();

        while(idx <= arr.length) {
            String tmp;
            if(idx == arr.length) tmp = String.valueOf(arr[idx-1]);
            else tmp = String.valueOf(arr[idx - 1]) + arr[idx];
            encoding(tmp);
        }

        int[] answer = new int[list.size()];
        int size = 0;
        for(int i : list) {
            answer[size++] = i;
            System.out.print(i + " ");
        }
        return answer;
    }
    static void encoding(String tmp) {
        int ans = 0;
        idx++;
        // 현재 문자열이 사전에 등록되었으며 남은 문자열이 있는 경우
        if(map.containsKey(tmp) && idx < arr.length) {
            encoding(tmp + arr[idx]); // 다음 문자까지 확인
        }
        // 사전에 등록되어 있으면서 남은 문자열이 없는 경우
        else if(map.containsKey(tmp)){
            idx++; // 마지막 문자만 따로 계산하지 않도록 idx를 범위 밖으로
            list.add(map.get(tmp));
        }
        // 사전에 등록 되지 않은 경우
        else {
            map.put(tmp, map.size() + 1);
            tmp = tmp.substring(0, tmp.length() - 1);

            list.add(map.get(tmp));
        }
    }
}