코딩테스트

프로그래머스 - 세 개의 구분자

오쟝 2023. 12. 20. 09:00

 

저는 split을 사용해서 문자열을 나누어 준 다음 ArrayList를 사용해 문자열의 길이를 비교해주는 방법을 생각했습니다!

import java.util.*;
class Solution {
    public String[] solution(String myStr) {
        String[] s = myStr.split("[abc]");
        ArrayList <String> list = new ArrayList();
        for(String str : s){
            if(str.length() > 0) list.add(str);
        }
        if(list.size() == 0) list.add("EMPTY");
        
        String[] answer = new String[list.size()];
        int n = 0;
        for(String str : list) answer[n++] = str;

        return answer;
    }
}

 

s String 배열에 [abc]를 기준으로 나누게 했습니다! 이렇게 하면 bear의 경우 [ "", e, "", r ] 와 같이 나오는 문제가 생깁니다!

따라서 ArrayList를 만든 후 s 배열의 str의 길이를 비교해 길이가 0보다 크면 list에 넣어주었습니다.

조건에서 array가 비어있다면 "EMPTY"를 넣으라고 했기 때문에 list의 길이가 0이면 EMPTY라는 글자를 넣어줬습니다!

list가 완성되었다면 answer에 값을 넣어주면 됩니다! 

 

이렇게 하면~

 

정답!!

하지만 다른 분의 코드를 보니까 stream을 사용하는 방법도 있더라구요!

전 아직 stream을 잘하지는 않지만 그래도 이해할 수 있고 훨씬 효율적인 코드인 것 같아서 가져와봤습니다!

import java.util.*;
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은 무엇일까?!

 

Stream 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해서 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있고, 병렬처리가 가능하게 해줍니다~


이 문제같은 경우 Stream을 배열과 사용할 것이기 때문에 Arrays.stream을 사용해줍니다!

myStr을 [abc]를 사용해 나누어진 결과 중 filter를 사용해 str 중 비어있는 값들을 제거해줍니다!비어있는 값들을 모두 제거하고 나면  toArray를 사용해 List를 String 배열로 바꿔줍니다!

 

마지막으로 arr의 길이가 0이라면 "EMPTY"가 들어있는 새로운 배열을 생성하고 0이 아니라면 arr을 return해줍니다!

 

Stream을 사용하니까 확실히 코드가 더 간결해지고 가독성도 좋아진 것 같습니다.. 앞으로 Stream을 더 많이 사용해봐야겠습니다!