임의의 문자열이 주어졌을 때 문자 "a", "b", "c"를 구분자로 사용해 문자열을 나누고자 합니다.
예를 들어 주어진 문자열이 "baconlettucetomato"라면 나눠진 문자열 목록은 ["onlettu", "etom", "to"] 가 됩니다.
문자열 myStr이 주어졌을 때 위 예시와 같이 "a", "b", "c"를 사용해 나눠진 문자열을 순서대로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.
단, 두 구분자 사이에 다른 문자가 없을 경우에는 아무것도 저장하지 않으며, return할 배열이 빈 배열이라면 ["EMPTY"]를 return 합니다.
내가 풀이한 것 중에 역대급으로 메모리를 많이 잡아먹은 풀이가 아니었나 한다.
split()으로 일괄되게 나누기 위해 Collections.replaceAll()로 a, b, c를 모두 임의의 문자열 "0"으로 바꾸어준다. 그 다음엔 String.join()으로 List 객체를 합쳐 하나의 문자열로 다시 만든다.
그 다음엔 contains()로 0이 포함되어 있는지 체크한 뒤 0을 구분자로 나누어 준다. 3개의 테스트 케이스 모두 a, b, c 셋 중 하나가 포함되어 있었지만 채점 시에는 없는 경우도 존재할 거라고 생각해서 그렇게 풀이했다.
split()을 이용하면 배열에 빈 문자열도 담기기 때문에 이를 없애 주기 위해 확장 for문으로 배열을 돌면서 빈 문자열이 아닌 경우에만 List 객체에 담아주었다. 그리고 3번 케이스처럼 a, b, c로만 이루어져 List 객체에 담긴 게 없는 경우에는 {"EMPTY"}를 반환한다.
마지막으로 toArray()로 반환 타입인 문자열 배열 형태로 List 객체를 변환해주면 풀이가 완료된다.
import java.util.*;
class Solution {
public String[] solution(String myStr) {
List<String> myStrList = Arrays.asList(myStr.split(""));
Collections.replaceAll(myStrList, "a", "0");
Collections.replaceAll(myStrList, "b", "0");
Collections.replaceAll(myStrList, "c", "0");
String newStr = String.join("", myStrList);
String[] answer;
if(newStr.contains("0")){
answer = newStr.split("0");
List<String> resultList = new ArrayList<>();
for (String s : answer) {
if (!s.isEmpty()) {
resultList.add(s);
}
}
if (resultList.isEmpty()) {
return new String[]{"EMPTY"};
}
answer = resultList.toArray(new String[resultList.size()]);
} else {
return new String[]{"EMPTY"};
}
return answer;
}
}
