[프로그래머스/181862] 세 개의 구분자
in Study / Coding Test
☑️ 문제
☑️ 풀이
첫 번째 풀이
//시간: 81.49ms
//메모리: 115MB
import java.util.*;
class Solution {
public String[] solution(String myStr) {
String[] answer = {};
String[] abc = {"a", "b", "c"};
StringBuilder sb;
for (int i = 0; i < abc.length; i++) {
String[] str = myStr.split(abc[i]);
myStr = String.join("-", str);
}
StringTokenizer st = new StringTokenizer(myStr, "-");
answer = new String[st.countTokens()];
int idx = 0;
while(st.hasMoreTokens()) {
answer[idx++] = st.nextToken();
}
return (answer.length == 0) ? new String[]{"EMPTY"} : answer;
}
}
- 반복문에서
abc
로 나누어진 문자열 배열을join
메서드를 사용하여 구분자-
를 포함한 문자열로 만들었다. - 그 후,
StringTokenizer
를 사용하여 구분자-
를 기준으로answer
배열에 담았다. - 만약
answer
배열의 길이가 0이면EMPTY
문자열을 원소로 가지는 배열을 반환하고, 그렇지 않으면answer
를 반환하도록 한다.- 처음에는 삼항연산자를
return (answer.length == 0) ? {"EMPTY"} : answer;
로 선언하여 에러가 발생하였다. {}
는 배열을 선언할 때 사용하는 문법이고, 배열을 직접 반환할 때는 newString[]{}
를 사용해야 한다는 걸 알았다.
- 처음에는 삼항연산자를
두 번째 풀이
//시간: 147.10ms
//메모리: 108MB
import java.util.*;
class Solution {
public String[] solution(String myStr) {
String[] str = myStr.split("[abc]");
List<String> list = new ArrayList<>();
for (int i = 0; i < str.length; i++) {
if (!str[i].equals("")) {
list.add(str[i]);
}
}
String[] answer = new String[list.size()];
for (int i = 0; i < list.size(); i++) {
answer[i] = list.get(i);
}
return (answer.length == 0) ? new String[]{"EMPTY"} : answer;
}
}
split()
메서드에 정규식[abc]
를 사용하여a, b, c
로 문자열을 구분해주는 방법을 사용하였다.
☑️ 문법 정리
split()
String[] result = 문자열.split(정규식[, 제한값]);
- 특정 구분자를 기준으로 문자열을 나누어 배열(String[])로 반환한다.
- 주로 문자열을 특정 패턴(예: 공백, 쉼표, 특정 문자 등)으로 분리할 때 사용한다.
- 정규식(구분자) : 문자열을 나눌 기준 (예:
“ “
,“,”
,“-”
,“[abc]”
등) - 제한값(선택적) : 배열의 최대 크기 (생략 가능)
- 0 또는 생략 → 모든 요소 반환
- 양수(N) → 최대 N개까지 분리
- 음수(-1) → 모든 요소 반환 (뒤쪽 공백 문자열도 포함)
split() 예제
기본 사용법
public class Main { public static void main(String[] args) { String text = "apple banana cherry"; String[] words = text.split(" "); // 공백 기준으로 분리 for (String word : words) { System.out.println(word); } } } // apple // banana // cherry
- 공백을 기준으로 문자열을 나누어 분리한다.
여러 개의 구분자로 분리 (정규식 사용)
public class Main { public static void main(String[] args) { String text = "javaahellobworldcprogram"; String[] words = text.split("[abc]"); // a, b, c 기준 분리 for (String word : words) { System.out.println(word); } } } // jav // hello // world // program
“[abc]”
→ a, b, c 중 하나라도 등장하면 분리된다.
split()
의 제한값 사용public class Main { public static void main(String[] args) { String text = "one,two,three,four,five"; String[] limit2 = text.split(",", 2); // 최대 2개로 분리 String[] limit3 = text.split(",", 3); // 최대 3개로 분리 String[] limit0 = text.split(",", 0); // 기본 설정 (모두 포함) String[] limitNeg = text.split(",", -1); // 모든 요소 포함 (뒤쪽 빈 문자열도 포함) System.out.println("Limit 2: " + Arrays.toString(limit2)); System.out.println("Limit 3: " + Arrays.toString(limit3)); System.out.println("Limit 0: " + Arrays.toString(limit0)); System.out.println("Limit -1: " + Arrays.toString(limitNeg)); } } // Limit 2: [one, two,three,four,five] // Limit 3: [one, two, three,four,five] // Limit 0: [one, two, three, four, five] // Limit -1: [one, two, three, four, five]
limit
값을 설정하면, 최대 몇 개까지 배열을 나눌지 지정할 수 있다.-1
을 사용하면 공백도 포함하여 모든 요소를 반환한다.
split() 주의사항
연속된 구분자는 빈 문자열을 생성한다.
public class Main { public static void main(String[] args) { String text = "apple,,banana,,cherry"; String[] words = text.split(","); System.out.println(Arrays.toString(words)); } } // [apple, , banana, , cherry]
- 쉼표가 연속되면 빈 문자열이 배열에 포함된다.
|
,.
같은 특수문자는\\
(이스케이프) 필요public class Main { public static void main(String[] args) { String text = "apple|banana|cherry"; String[] words = text.split("\\|"); // '|' 기준으로 분리 System.out.println(Arrays.toString(words)); } } // [apple, banana, cherry]
|
,.
,*
,+
같은 특수문자는\\
를 붙여 사용해야 한다.
String.join()
String result = String.join(구분자, 문자열 배열 또는 리스트);
- 문자열 배열 또는 리스트의 요소들을 특정 구분자로 연결하여 하나의 문자열로 변환한다.
- 구분자 : 각 요소 사이에 삽입할 문자열
예제
문자열 배열을
join()
으로 결합public class Main { public static void main(String[] args) { String[] words = {"apple", "banana", "cherry"}; String result = String.join(",", words); System.out.println(result); } } // apple, banana, cherry
“, “
(쉼표 + 공백) 구분자로 문자열 배열의 요소들을 결합한다.
리스트를
join()
으로 결합import java.util.*; public class Main { public static void main(String[] args) { List<String> words = Arrays.asList("dog", "cat", "elephant"); String result = String.join(" - ", words); System.out.println(result); } } // dog - cat - elephant
String.join()을 활용한 문제 해결
문제: 특정 문자(a, b, c)를 기준으로 문자열을 분리한 후 다시
“-”
로 결합하기public class Main { public static void main(String[] args) { String myStr = "abacabc"; String[] splitResult = myStr.split("[abc]"); String result = String.join("-", splitResult); System.out.println(result); } } // ---
“abacabc”
에서“a”
,“b”
,“c”
를 기준으로 분리하면 빈 문자열들이 나온다.- 이 빈 문자열들을
“-”
로 연결하면“---”
이 된다.