프로그래머스 2018 KAKAO BLIND RECRUITMENT Level 2 문제 압축을 Java를 이용해 풀어보았다.
HashMap을 이용해 간단하게 풀었다.
문제 링크 첨부한다.
https://programmers.co.kr/learn/courses/30/lessons/17684
한 글자짜리 사전을 먼저 초기화한다. 단어를 Key, 색인 번호를 Value로 설정했다.
void dictInit(){
char cur = 'A';
for(int i=0; i<26; i++){
String s = Character.toString(cur);
cur++;
map.put(s, i+1);
}
}
A-Z까지 1번부터 26번으로 초기화해주는 메소드다.
while
문과 for
문을 활용해서 앞에서부터 한 글자씩 추가해가며 map
에 없는 단어를 찾게 되면,
1. 그 단어를 map
에 기존 map
사이즈에 1을 더한 번호로 추가해주고,
2. 해당 단어의 마지막 글자만 뺀, 이미 존재하는 단어의 색인 번호를 결과 배열에 추가해주고,
3. 탐색을 마친 마지막 지점에서부터 마지막까지 msg
를 subString(int from)
을 이용해서 새롭게 갱신한다.
이를 코드로 표현하면 다음과 같다.
ArrayList<Integer> list = new ArrayList<>();
while(msg.length()!=0){
if(map.containsKey(msg)) {
list.add(map.get(msg));
break;
}
String tmp = "";
int idx = 0;
for(; idx<msg.length(); idx++){
tmp += msg.charAt(idx);
if(!map.containsKey(tmp)){ // 사전에 없는 단어면
map.put(tmp, map.size()+1); // 사전에 추가해주고
tmp = tmp.substring(0, tmp.length()-1);
list.add(map.get(tmp)); // 막 글자 뺀 녀석 번호 추가해주고
break;
}
}
msg = msg.substring(idx); // 문자열 갱신해주고
}
HashMap을 이용한 그리 어렵지 않은 문제였다. 아래는 내가 제출한 코드다.
import java.util.ArrayList;
import java.util.HashMap;
public class Compressor {
static HashMap<String, Integer> map = new HashMap<>();
static int[] solution(String msg) {
ArrayList<Integer> list = new ArrayList<>();
dictInit();
while(msg.length()!=0){
if(map.containsKey(msg)) {
list.add(map.get(msg));
break;
}
String tmp = "";
int idx = 0;
for(; idx<msg.length(); idx++){
tmp += msg.charAt(idx);
if(!map.containsKey(tmp)){ // 사전에 없는 단어면
map.put(tmp, map.size()+1);
tmp = tmp.substring(0, tmp.length()-1);
list.add(map.get(tmp));
break;
}
}
msg = msg.substring(idx);
}
int[] answer = list.stream().mapToInt(i -> i).toArray();
return answer;
}
static void dictInit(){
char cur = 'A';
for(int i=0; i<26; i++){
String s = Character.toString(cur);
cur++;
map.put(s, i+1);
}
}
public static void main(String[] args) {
String msg = "TOBEORNOTTOBEORTOBEORNOT";
int[] answer = solution(msg);
for(int a: answer) System.out.println(a);
}
}