import java.util.ArrayList;
import java.util.List;
class Solution {
public String[] solution(String myStr) {
List<String> list = new ArrayList<>();
// 첫 시작 인덱스
int index1 = -1;
// 끝나는 인덱스 (a, b, c 중 하나 직전) => 변수 없어도 되나 가독성 증가
int index2 = -1;
// 전체를 돌면서 검사
for (int i = 0; i < myStr.length(); i++) {
char tmp = myStr.charAt(i);
// 구분자가 아니다 -> 그러면 단어 시작을 나타냄
if (!(tmp == 'a' || tmp == 'b' || tmp == 'c')) {
index1 = i;
// 단 구분자를 다 지나고 마지막일 경우 단어를 추가
// ex) abcd -> d
if(i == myStr.length()-1 && index1 == i) {
list.add(myStr.substring(i));
}
}
// 구분자를 만남 -> 단어 시작이 아니니깐 다음 단어 검사
// 다음 for문을 실행하지 않음
else
continue;
// 구분자가 아닐 경우, 다음 구분자를 만나기 전까지의 단어를 추출하여 리스트에 넣기 위함
for(int k =i+1; k<myStr.length(); k++) {
char tmp2 = myStr.charAt(k);
// index1이 -1이 아니라면, 원래 구분자가 아닌 시작하던 지점이 있으니 거기부터 추출
if (index1 != -1) {
if ((tmp2 == 'a' || tmp2 == 'b' || tmp2 == 'c')) {
index2 = k;
list.add(myStr.substring(index1, index2));
// 추출 했으니 다시 초기화
index1 = -1;
// k번째 단어 까지는 검사를 했으니 k번째부터 다시 반복
// 위 조건에 의해 k번째가 구분자지만, k+1이 아닌 이유는
// 해당 for문이 break가 된 시점에 i=k 이기에, 다음 반복문에는 i=k+1이 되기 때문
i=k;
break;
}
// 만일 현재 문자가 구분자가 아니고, 바로 다음 문자가 문장의 끝이라면
// 가장 마지막 단어이니 리스트에 넣고, i를 k로 갱신
// 이렇게 되면 i = length -1 이라서 다음 루프도 한번 돌 것 같지만
// 실제로는 i++ 되어 다음 루프때는 i = length가 되어 돌지 않고 종료됨.
else if(k == myStr.length()-1) {
list.add(myStr.substring(index1));
i = k;
}
}
}
}
// 리스트에 아무것도 없다 -> 모두 구분자 단어로 이루어짐
if (list.size() == 0)
return new String[] {"EMPTY"};
// 리스트에 있다면 배열로 변환하여 리턴
return list.toArray(new String[0]);
}
}
