반응형
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

개발 쥬스

[프로그래머스/Java] 181862 세 개의 구분자 본문

알고리즘

[프로그래머스/Java] 181862 세 개의 구분자

DevJuice 2024. 11. 13. 21:27
반응형

🔗 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/181862

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

🔍  해결 과정

이 문제는 "a", "b", "c" 세 가지 기준 문자열을 바탕으로 문자열을 배열 형식으로 반환하는 문제입니다.

세 개의 구분자를 바탕으로 구분하기 위해 저는 StringTokenizer에서 정규 표현식을 활용하였습니다.

 

활용한 정규표현식과 뜻은 다음과 같습니다.

"[abc]+"

1️⃣ [abc]의 의미: a 또는 b 또는 c로 구성된 문자열을 의미합니다.

2️⃣ +: 앞의 정규표현식을 만족하는 문자열이 최소 한 개는 있어야 한다는 의미입니다.

 

핵심 코드는 다음과 같습니다.

StringTokenizer st = new StringTokenizer(myStr, "[abc]+");

이 방식을 적용하면 문제가 요구하는 문자열들을 각각의 토큰으로 받을 수가 있습니다.

 

❗️주의사항

참고로 문자열의 split() 함수도 정규표현식을 적용하여 특정 기준을 바탕으로 문자열 배열로 만들 수가 있습니다.

myStr.split("[abc]+")

 

하지만 문제의 예시에서 "baconlettucetomato” 의 문자열이 있다고 가정했을 때 split의 정규표현식을 적용하면 다음과 같이 나뉘게 됩니다.

["", "onlettu", "etom", "to"]

 

즉 split() 함수는 특정 기준을 바탕으로 왼쪽 영역의 문자열을 담아내기 때문에 문자열 첫 부분에 기준 문자열이 있다면 빈 문자열로 담아내게 됩니다. 그래서 split()을 적용한 후 특정 조건을 거쳐 배열로 담는 방법이 있습니다. (아래 코드는 숏코딩 형식)

String[] arr = Arrays.stream(myStr.split("[abc]+")).filter(str -> !str.isEmpty()).toArray(String[]::new);

✏️ 코드

import java.util.*;

class Solution {
    public String[] solution(String myStr) {
        StringTokenizer st = new StringTokenizer(myStr, "[abc]+");
        int count = st.countTokens();
        
        if (count == 0) {
            return new String[]{"EMPTY"};
        }
        
        String[] answer = new String[count];
        
        int idx = 0;
        
        while (st.hasMoreTokens()) {
            answer[idx++] = st.nextToken();
        }
        
        return answer;
    }
}
반응형