문제 설명
임의의 문자열이 주어졌을 때 문자 "a", "b", "c"를 구분자로 사용해 문자열을 나누고자 합니다.
예를 들어 주어진 문자열이 "baconlettucetomato"라면 나눠진 문자열 목록은 ["onlettu", "etom", "to"] 가 됩니다.
문자열 myStr이 주어졌을 때 위 예시와 같이 "a", "b", "c"를 사용해 나눠진 문자열을 순서대로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.
단, 두 구분자 사이에 다른 문자가 없을 경우에는 아무것도 저장하지 않으며, return할 배열이 빈 배열이라면 ["EMPTY"]를 return 합니다.
제한사항
1 ≤ myStr의 길이 ≤ 1,000,000 myStr은 알파벳 소문자로 이루어진 문자열 입니다.
나의 코드
import java.util.List;
import java.util.ArrayList;
class Solution {
public String[] solution(String myStr) {
List<String> list = new ArrayList<>();
int temp = 0;
// a, b, c가 등장할 때마다 잘라서 list에 넣어줌
for(int i=0; i<myStr.length(); i++) {
if(myStr.charAt(i) == 'a' || myStr.charAt(i) == 'b' || myStr.charAt(i) == 'c') {
list.add(myStr.substring(temp, i));
temp = i+1;
}
}
// 마지막 구분자 이후 문자열을 처리
if(temp<myStr.length()) {
list.add(myStr.substring(temp));
}
// 비어있는 list 제거 (제거할 때마다 인덱스는 앞당겨지므로 j--를 통해 다시 확인)
for(int j=0; j<list.size(); j++) {
if(list.get(j).isEmpty()) {
list.remove(j);
j--;
}
}
// 최종적으로 다 비어있는 list는 문제에 따라 "EMPTY" 처리
if(list.isEmpty()) {
list.add("EMPTY");
}
// 리스트를 문제에서 원하는 String 배열로 변환
String[] answer = new String[list.size()];
for(int k=0; k<list.size(); k++) {
answer[k] = list.get(k);
}
return answer;
}
}
코드가 길어져서 주석으로 설명 남김
다른 사람 코드
import java.util.Arrays;
class Solution {
public String[] solution(String myStr) {
String[] arr = Arrays.stream(myStr.split("[abc]+")).filter(str -> !str.isEmpty()).toArray(String[]::new);
return arr.length == 0 ? new String[] { "EMPTY" } : arr;
}
}
stream
, split()
의 정규표현식
, 삼항연산자
를 통해 해결
import java.util.StringTokenizer;
class Solution {
public String[] solution(String myStr) {
String[] answer = {};
StringTokenizer st = new StringTokenizer(myStr,"abc");
if(st.countTokens() != 0){
answer = new String[st.countTokens()];
for(int i=0; i<answer.length; i++){
answer[i] = st.nextToken();
}
}else{
answer = new String[1];
answer[0] = "EMPTY";
}
return answer;
}
}
StringTokenizer
활용
느낀 점
문제에 생각보다 조건이 많아 까다로웠다. 조건을 위해 테스트를 거치며 필요한 로직을 하나하나 추가하다보니 좀 많이 길어진 느낌.. 코드가 길기도 하고 메모리도 많이 잡아먹을 것 같아서 나중에 문제를 풀어가며 성장했을 때 좀 더 나은 코드로 짤 수 있는 지 고민해보자