https://programmers.co.kr/learn/courses/30/lessons/17684
사실 본인은 아래 코드 처럼 깔끔하게 코딩을 하지 못했다. 풀고나서 다른 사람 풀이를 보고 정리한 상태이다.
간단하게 이해해보자면 기존 알파벳을 전부 등록하고 문자열을 2개 씩 붙혀가면서 비교한다.
과정에서 고려해야하는 것은 반복문 중에 index가 마지막 위치까지 오는 경우이다.
import java.util.ArrayList;
import java.util.HashMap;
// 프로그래머스 압축 문제
class Compression {
static HashMap<String, Integer> map = new HashMap<>();
static ArrayList<Integer> list = new ArrayList<>();
static char[] arr;
static int idx = 1;
public int[] solution(String msg) {
for(int i = 0; i < 26; i++){
map.put(String.valueOf((char)('A' + i)), i + 1);
}
arr = msg.toCharArray();
while(idx <= arr.length) {
String tmp;
if(idx == arr.length) tmp = String.valueOf(arr[idx-1]);
else tmp = String.valueOf(arr[idx - 1]) + arr[idx];
encoding(tmp);
}
int[] answer = new int[list.size()];
int size = 0;
for(int i : list) {
answer[size++] = i;
System.out.print(i + " ");
}
return answer;
}
static void encoding(String tmp) {
int ans = 0;
idx++;
// 현재 문자열이 사전에 등록되었으며 남은 문자열이 있는 경우
if(map.containsKey(tmp) && idx < arr.length) {
encoding(tmp + arr[idx]); // 다음 문자까지 확인
}
// 사전에 등록되어 있으면서 남은 문자열이 없는 경우
else if(map.containsKey(tmp)){
idx++; // 마지막 문자만 따로 계산하지 않도록 idx를 범위 밖으로
list.add(map.get(tmp));
}
// 사전에 등록 되지 않은 경우
else {
map.put(tmp, map.size() + 1);
tmp = tmp.substring(0, tmp.length() - 1);
list.add(map.get(tmp));
}
}
}
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
프로그래머스 셔틀버스 문제 (자바) (0) | 2021.06.07 |
---|---|
프로그래머스 - N개의 최소공배수 문제 (자바) (0) | 2021.06.06 |
프로그래머스 - 스킬트리 문제 (자바) (0) | 2021.06.04 |
프로그래머스 - 프렌즈4블록 문제 (자바) (0) | 2021.06.04 |
프로그래머스 - [3차] 파일명 정렬 문제 (자바) (0) | 2021.06.03 |