이번에 풀어본 문제는
프로그래머스 압축 입니다.
import java.util.*;
class Solution {
public int[] solution(String msg) {
int[] answer;
int msgLen = msg.length();
Queue<String> q = new LinkedList<>();
for (int i = 0; i < msgLen; i++) {
q.add(msg.charAt(i)+"");
}
Map<String, Integer> dic = new HashMap<>();
for (int i = 65; i <= 90; i++) {
dic.put((char)i+"", i - 64);
}
List<Integer> result = new ArrayList<>();
String curString = "";
while(!q.isEmpty()) {
while (!q.isEmpty() && dic.containsKey(curString + q.peek())) {
curString = curString.concat(q.poll());
}
// 색인 번호
result.add(dic.get(curString));
// 아직 입력이 남았으면,
if (!q.isEmpty()) {
dic.put(curString.concat(q.peek()), dic.size() + 1);
}
// 초기화
curString = "";
}
int resultSize = result.size();
answer = new int[resultSize];
for (int i = 0; i < resultSize; i++) {
answer[i] = result.get(i);
}
return answer;
}
}
주어진 입력을 사전과 비교하여 색인 번호를 출력하는 문제입니다.
모든 입력을 Queue에 담아주고, 최상단 값과 비교하면서 가장 긴 문자열을 찾습니다. 문자열을 찾았다면, 해당하는 색인을 result list에 담아줍니다. 아직 입력값이 남았다면, 방금 문자열과 다음 입력값을 더한 문자열을 사전에 추가해주면 됩니다. 위 과정을 반복하면 해결할 수 있습니다.
문제를 이해하기는 복잡했는데, 구현은 쉬웠던 것 같습니다!