
프로그래머스 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);
}
}