[プログラマー][3回目]圧縮(java)/2018 KAKAO BLIND RECRUIMENT
16371 ワード
こんにちは!今日はプログラマーの[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)完全コード
いつも問題を解くときにテスト用例が見つからず、コードエラーの原因が見つからないので、大変です.だから今回は自分で間違いの理由を見つけました!問題を解くときは盲目的にコードを書かないで、ゆっくりと紙に論理を書くと役に立ちます.
msgの最後の部分の処理でいくつかの困難に遭遇し,index HashMapに値を入れる必要はなく,存在しない場合にのみ入れることで問題が解決した.
1)問題リンク
https://programmers.co.kr/learn/courses/30/lessons/17684
2)問題を解く
✔HashMapを使用したデフォルトインデックスの作成
HashMapを使用してインデックスを管理します.HashMapのキーワードは「索引語」(String)で、索引番号はvalueです.アルファベットAからZへの基本インデックスを作成するには、Askyコードを使用します.
✔圧縮関数の作成
LZWアルゴリズムを使用して圧縮文字列の関数を作成します.この関数の論理順序は次のとおりです.
1.最初のString Aで
->新しいString B=(i第String)+(i+1第String)
->A交換B
戻り->1(インデックスにAがないまで繰り返す)
->Aのインデックス番号を解答リストに保存
->Bは新しい引用符としてhashMapに
注意✔msgの最後のインデックス
与えられたmsgの最後のインデックスに注意が必要です.最後のindex iでは、iを含まないStringをAと呼び、iを含む新しいStringをBと呼ぶ.△上記の圧縮論理をよく考えてみると、最後の部分はAとBが今説明しているように!
->Bはインデックスに保存されません
->Bのインデックス番号を解答リストに保存する
->Bインデックスに保存
->Aのインデックス番号を解答リストに保存する
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に値を入れる必要はなく,存在しない場合にのみ入れることで問題が解決した.
Reference
この問題について([プログラマー][3回目]圧縮(java)/2018 KAKAO BLIND RECRUIMENT), 我々は、より多くの情報をここで見つけました https://velog.io/@fantastik/46テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol