요르딩딩
프로그래머스 : 3차 압축 자바 (알파벳 char, lastIndex사용, 이전상태값) 본문
https://programmers.co.kr/learn/courses/30/lessons/17684
이번문제는 생각보다 쉬운듯하면서도 어렵게 느껴졌던 문제이다.
그 이유는 마지막 문자열에대한 처리를 어떻게 해야할지 명확히 인지하지 않은 체 구현을 하려고 했기 때문인 것 같다.
위와 같은 이슈를 해결하고자 검색을 해봤지만, 보다 심플한 로직이 없어 결국 다시한번 고민한 끝에 정답을 맞출 수 있었다.
구현한 방식에 대해서 설명해보도록 하겠다.
1. ArrayList<String>에 A~Z값을 넣고, index를 숫자로 사용했다. (index =0은 ""빈 문자열을 넣어 제외하도록했다.)
또 ArrayList는 Collection이므로 contains를 사용할 수 있기에 적합하다고 판단했다.
2. 첫번째 문자부터 하나씩 늘려가며, 포함여부를 판단했다.
포함돼 있으면 num변수를 갱신한다.
포함 안돼있으면 ArrayList에 넣고, 다음 반복문이 해당 위치부터 시작할 수 있도록 ( i = indexJ -2)로 수정한다.
ex) "KAO"일때 포함이 안돼있으므로, ArrayList에 넣고, i = index -2를 사용해, 다음 반복문에 "O"부터 시작할 수 있도록 한다.
3. 여기서 중요한 마지막 포인트
반복문이 마지막에 도달했을 경우 이전상태가 포함인지, 미포함인지에 따라 ArrayList에 추가여부가 달라진다.
만약 두번쨰 반복문이 마지막이면서 이전상태가 미포함이면, 마지막값은 넣지 않는다.
그 외의 경우인 마지막이면서 이전상태가 포함이면, 마지막값을 넣는다.
구현에 있어서는 이렇게 3가지 포인트가 있다.
문제를 풀때는 쉽게 접근할 수 있는것 처럼 생각했으나, 막상 구현할때는 위와같은 케이스들을 고려하자니 애를 먹었다.
아직은 마지막 index에 따른 처리능력이 부족한거 같아, 이부분을 신경써서 공부하도록 해야겠다.
import java.util.*;
class Solution {
public int[] solution(String msg) {
int[] answer = {};
ArrayList<Integer> answerList = new ArrayList<Integer>();
ArrayList<String> stList = new ArrayList<String>();
char a = 'A';
stList.add(""); // 인덱스 0 : ""처리
for (int i = 0; i < 26; i++) {
stList.add(String.valueOf((char) (a + i))); // ["A", "B", ...]
}
String chechSt = "";
int num = -1;
int indexJ = -1;
boolean include = false;
boolean beforeInclude = false; // *****
for (int i = 0; i < msg.length(); i++) {
beforeInclude = include; // 전의 상태값 가지고 있기******
include = false; // 초기화
for (int j = i + 1; j < msg.length() + 1; j++) {
chechSt = msg.substring(i, j);
indexJ = j;
if (stList.contains(chechSt)) { // 찾은 경우
include = true;
num = stList.indexOf(chechSt);
} else { // 못찾은 경우
include = false;
stList.add(chechSt);
i = indexJ - 2; // 없는 경우 : 추가 후 j위치부터 i를 시작하도록해야한다. (i++, j++ 이기에 -2를 한다.)*****
break;
}
}
if (beforeInclude && indexJ == msg.length()) { // 전상태가 포함하면서 마지막인경우 : 값을 추가하지 않는다. *****
break;
}
answerList.add(num);
}
answer = answerList.stream().mapToInt(i -> i).toArray(); // 리스트 -> 배열
return answer;
}
}