-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy path압축.java
68 lines (53 loc) · 2.02 KB
/
압축.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package week27;
import java.io.*;
import java.util.*;
class 압축 {
static Map<String, Integer> words;
static List<Integer> answer;
public int[] solution(String msg) {
words = new HashMap<>();
answer = new ArrayList<>();
makeDict();
char[] msgArr = msg.toCharArray();
boolean isLast = false;
for(int i=0; i<msgArr.length; i++) {
StringBuilder sb = new StringBuilder();
sb.append(msgArr[i]);
if(i == msgArr.length - 1) { // 시작 위치가 마지막 인덱스에 도달한 경우
answer.add(words.get(String.valueOf(msgArr[i])));
break;
}
int cnt = 0; // 늘린 글자 수
for(int j=i+1; j<msgArr.length; j++) { // 한 글자씩 늘려가며 사전에 있는 단어인지 확인
sb.append(msgArr[j]);
String now = sb.toString();
if(!words.containsKey(now)) { // 사전에 없는 단어인 경우
words.put(now, words.size() + 1);
answer.add(words.get(now.substring(0, now.length() - 1)));
break;
}
if(j == msgArr.length - 1) { // 한 글자씩 늘려가다 마지막 문자에 도달한 경우
isLast = true;
}
cnt++;
}
if(isLast) { // 한 글자씩 늘려가다 마지막 문자에 도달한 경우 "시작 지점 ~ 마지막 글자"를 answer에 추가
answer.add(words.get(sb.toString()));
}
i += cnt; // 늘린 글자 수 만큼 다음 탐색 시작 위치 조정
}
return answer.stream().mapToInt(i -> i).toArray();
}
private static void makeDict() { // 사전 초기화
char cur = 'A';
int idx = 1;
while(true) {
words.put(String.valueOf(cur), idx);
if(cur == 'Z') {
break;
}
cur++;
idx++;
}
}
}