[プログラマー][3回目]圧縮(java)/2018 KAKAO BLIND RECRUIMENT


こんにちは!今日はプログラマーの[3回]圧縮問題を解決します.この問題は2018年にKAKAO BLIND RECRUITMENTから提起された.
1)問題リンク
https://programmers.co.kr/learn/courses/30/lessons/17684
2)問題を解く
✔HashMapを使用したデフォルトインデックスの作成
HashMapを使用してインデックスを管理します.HashMapのキーワードは「索引語」(String)で、索引番号はvalueです.アルファベットAからZへの基本インデックスを作成するには、Askyコードを使用します.
✔圧縮関数の作成
LZWアルゴリズムを使用して圧縮文字列の関数を作成します.この関数の論理順序は次のとおりです.
1.最初のString Aで
  • 1-1. 「インデックス」(HashMap)にAがある場合
    ->新しいString B=(i第String)+(i+1第String)
    ->A交換B
    戻り->1(インデックスにAがないまで繰り返す)
  • 1-2. 「インデックス」(HashMap)にAがない場合
    ->Aのインデックス番号を解答リストに保存
    ->Bは新しい引用符としてhashMapに
  • を登録します.
    注意✔msgの最後のインデックス
    与えられたmsgの最後のインデックスに注意が必要です.最後のindex iでは、iを含まないStringをAと呼び、iを含む新しいStringをBと呼ぶ.△上記の圧縮論理をよく考えてみると、最後の部分はAとBが今説明しているように!
  • 2-1. 新しいString Bが「インデックス」(HashMap)にある場合、
    ->Bはインデックスに保存されません
    ->Bのインデックス番号を解答リストに保存する
  • 2-2. インデックスに新しいString Bがない場合
    ->Bインデックスに保存
    ->Aのインデックス番号を解答リストに保存する
  • 3)完全コード
    import java.util.*;
    
    class Solution {
        public int[] solution(String msg) {
            Map<String, Integer> index = makeBasicIndex();
            String[] arr = msg.split("");
            
            List<Integer> answer = compress(index, arr);
            
            return listToArray(answer);
        }
        
        //기본 색인 생성(A ~ z) 65 ~ 90
        private Map<String, Integer> makeBasicIndex() {
            Map<String, Integer> index = new HashMap<>();
            
            for(int i = 65; i <= 90; i++) {
                index.put(Character.toString((char) i), i - 64);
            }
            
            return index;
        }
        
        private List<Integer> compress(Map<String, Integer> index, String[] arr) {
            List<Integer> answer = new ArrayList<>();
            int length = arr.length;
            
            for(int i = 0; i < length; i++) {
                StringBuilder sb = new StringBuilder();
                
                if(i >= length - 1) {
                    answer.add(index.get(arr[i]));
                    break;
                }
                
                while(i < length) {
                    sb.append(arr[i]);
                    if(index.containsKey(sb.toString())) {
                        i++;
                    } else {
                        break;
                    }
                }
                
                //while 결과
                //sb에 있는 값 = index에 새로 추가해야 할 값
                //sb - 맨 끝자리 = index에서 찾아서 value answer list에 추가
                if(!index.containsKey(sb.toString())) {
                    index.put(sb.toString(), index.size() + 1);
                }
                
                if(i != length) {
                    sb.deleteCharAt(sb.length() - 1);
                }
                
                answer.add(index.get(sb.toString()));
                i--;
            }
            
            return answer;
        }
        
        private int[] listToArray(List<Integer> list) {
            int[] array = new int[list.size()];
            int idx = 0;
            for(int num : list) {
                array[idx] = num;
                idx++;
            }
            
            return array;
        }
    }
    4)感じ
    いつも問題を解くときにテスト用例が見つからず、コードエラーの原因が見つからないので、大変です.だから今回は自分で間違いの理由を見つけました!問題を解くときは盲目的にコードを書かないで、ゆっくりと紙に論理を書くと役に立ちます.
    msgの最後の部分の処理でいくつかの困難に遭遇し,index HashMapに値を入れる必要はなく,存在しない場合にのみ入れることで問題が解決した.