[3차] 압축 : https://programmers.co.kr/learn/courses/30/lessons/17684
문자열 msg를 순차적으로 돌면서 현재 문자 w와 다음 알파벳 c가 사전에 등록되어있지 않다면 w+c 문자를 사전에 추가하고 색인은 초기화 시켜준다. 그 다음에는 알파벳 c가 w가 되고 w+c를 사전 등록 여부를 확인하면서 반복해준다.
w의 등록 여부를 마치게 되면 색인을 색인 리스트(indexs)에 저장해주게 된다.
이 때 주의 해야 할점은 w가 마지막 단어 까지 돌았을때 w의 index를 관리해 주지 않으면 프로세스가 꼬이게 된다.(코드에서 확인)
색인 리스트(indexs)에 있는 색인을 반환해주면 된다.
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
class Solution {
public int[] solution(String msg) {
//사전
HashMap<String, Integer> map = new HashMap<>();
//사전 초기화
setMap(map);
//index리스트
List<Integer> indexs = new ArrayList<>();
for(int i=0;i<msg.length();i++){
//사전에서 현재 입력과 일치하는 가장 긴 문자열 w 초기화
String w = String.valueOf(msg.charAt(i));
for(int j=i+1;j<msg.length();j++){
//다음 글자 c
String c = String.valueOf(msg.charAt(j));
//사전에 저장 여부를 확인할 단어
String wc = w+c;
//해당 단어가 사전에 저장되어있지 않다면
if(!map.containsKey(wc)){
//사전에 등록해주고
map.put(wc, map.size()+1);
//다음 사전에 등록을 비교할 단어를 위한 index i 관리
i = j-1;
break;
}
//wc가 사전에 등록되어있으므로 wc가 사전에서 현재 입력과 일치하는 가장 긴 문자열 w가 된다.
w = wc;
//c를 문자열 끝까지 비교했다면 다음 비교할 단어는 없기때문에 i도 j로 바꿔줘 더 이상 반복문에서 비교할수 없게 끝내준다.
if(j==msg.length()-1){
i=j;
}
}
//비교가 끝난 w를 indexㅔ 넣어준다
indexs.add(map.get(w));
}
int[] answer = new int[indexs.size()];
for(int i=0;i<indexs.size();i++){
answer[i] = indexs.get(i);
}
return answer;
}
//사전 초기화
void setMap(HashMap<String, Integer> map){
char alpabet = 'A';
for(int i = 1;i<=26;i++){
map.put(String.valueOf(alpabet),i);
alpabet+=1;
}
}
}
이제 조금씩 char을 다루는게 익숙하고 index를 다루는게 바로 생각나지는 않지만 조금 고민해보고 예상해본 상황이 들어맞는게 신기하다.