알고리즘/프로그래머스
[JAVA/HashMap] 프로그래머스 압축
waterground
2021. 10. 17. 14:46
1. 문제
https://programmers.co.kr/learn/courses/30/lessons/17684?language=java#
코딩테스트 연습 - [3차] 압축
TOBEORNOTTOBEORTOBEORNOT [20, 15, 2, 5, 15, 18, 14, 15, 20, 27, 29, 31, 36, 30, 32, 34]
programmers.co.kr
2. 코드
import java.util.*;
class Solution {
// 알파벳 사전 초기화
public static void initDic(HashMap<String, Integer> hm){
for(int i = 0; i < 26; i++){
hm.put(Character.toString('A' + i), i+1);
}
}
public int[] solution(String msg) {
HashMap<String, Integer> hm = new HashMap<String, Integer>();
ArrayList<Integer> numList = new ArrayList<Integer>();
String sub = "";
initDic(hm);
int maxLen = 1; // 사전에 있는 단어의 최대 길이
int idx = 27; // 다음 색인에 추가될 단어의 숫자
for(int i = 0; i < msg.length(); i++){ // 단어의 앞쪽 알파벳부터
for(int l = maxLen; l >= 1; l--){ // 가장 긴 문자열부터 매칭되는지 찾는다
if(i + l > msg.length()) continue;
sub = msg.substring(i, i + l);
if(hm.containsKey(sub)){ // 사전에 있으면
numList.add(hm.get(sub)); // 답에 추가
maxLen = Math.max(maxLen, sub.length() + 1); // 가장 긴 문자열 길이 갱신
i += l - 1;
break;
}
}
if(i + 1 >= msg.length()) break; // 마지막까지 매칭 찾았으면 종료
// 사전에 추가
String next = sub + Character.toString(msg.charAt(i + 1));
if(hm.containsKey(next) == false)
hm.put(next, idx++); // 다음 색인 추가
}
int[] answer = new int[numList.size()];
for(int i = 0; i < answer.length; i++){
answer[i] = numList.get(i);
}
return answer;
}
}