세 개의 구분자

nacSeo (낙서)·2024년 2월 26일
0

프로그래머스

목록 보기
106/169

문제 설명

임의의 문자열이 주어졌을 때 문자 "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 활용

느낀 점

문제에 생각보다 조건이 많아 까다로웠다. 조건을 위해 테스트를 거치며 필요한 로직을 하나하나 추가하다보니 좀 많이 길어진 느낌.. 코드가 길기도 하고 메모리도 많이 잡아먹을 것 같아서 나중에 문제를 풀어가며 성장했을 때 좀 더 나은 코드로 짤 수 있는 지 고민해보자

profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글