문제설명
문자열 myString이 주어집니다. "x"를 기준으로 해당 문자열을 잘라내 배열을 만든 후 사전순으로 정렬한 배열을 return 하는 solution 함수를 완성해 주세요.
단, 빈 문자열은 반환할 배열에 넣지 않습니다.
제한사항
- 1 ≤ myString ≤ 100,000
- myString은 알파벳 소문자로 이루어진 문자열입니다.
입출력 예
입출력 예 설명
입출력 예 #1
- myString을 "x"를 기준으로 자른 배열은 ["a","b","c","d"]이며, 이 배열은 이미 사전순으로 정렬된 상태입니다. 따라서 해당 배열을 return 합니다.
입출력 예 #2
- myString을 "x"를 기준으로 자른 배열은 ["d","cc","bbb","aaaa"]이며, 이 배열을 사전순으로 정렬하면 ["aaaa","bbb","cc","d"]입니다. 따라서 해당 배열을 return 합니다.
코드 설명
1. x를 기준으로 문자열 자르기
저는 아래와 같은 방법으로 구현을 해보았습니다.
먼저 문자열을 돌며 현재 인덱스에 있는 char를 구한 다음 만약 그 char가 x 라면
List<String> answer = new ArrayList<>();
결과를 저장할 ArrayList를 초기화해줍니다.
StringBuilder words = new StringBuilder();
"x"로 분리된 문자열을 임시로 저장하기 위한 StringBuilder를 초기화합니다.
// 1. x를 기준으로 문자열 잘라내기
for(int i = 0; i < str.length(); i++){
char currentChar = str.charAt(i);
if(currentChar == 'x') {
if(words.length() > 0) {
answer.add(words.toString());
words.setLength(0); // stringbuilder 값 초기화
}
} else {
words.append(currentChar);
}
}
if (words.length() > 0) {
answer.add(words.toString());
}
문자열을 순회하며 charAt() 메소드를 이용하여 현재 인덱스의 문자를 가져옵니다.
그 후 현재 문자가 "x"인지 확인을 합니다.
if(words.length() > 0) { ... }
만약 이전까지 쌓인 문자열이 있다면, 이를 리스트에 추가하고 StringBuilder를 초기화합니다.
else { words.append(currentChar); }
현재 문자가 "x"가 아니라면, StringBuilder에 문자를 추가합니다.
if (words.length() > 0) { answer.add(words.toString()); }
문자열 순회가 끝난 후, StringBuilder에 남아 있는 문자열이 있다면, 이를 리스트에 추가합니다.
2. 사전순으로 문자열 정렬하기
Collections.sort(answer);
sort() 함수를 이용하여 리스트에 저장된 문자열을 사전순으로 정렬합니다.
소스코드&결과
소스코드
import java.util.*;
class Solution {
public List<String> solution(String str) {
List<String> answer = new ArrayList<>();
StringBuilder words = new StringBuilder();
// 1. x를 기준으로 문자열 잘라내기
for(int i = 0; i < str.length(); i++){
char currentChar = str.charAt(i);
if(currentChar == 'x') {
if(words.length() > 0) {
answer.add(words.toString());
words.setLength(0); // stringbuilder 값 초기화
}
} else {
words.append(currentChar);
}
}
if (words.length() > 0) {
answer.add(words.toString());
}
// 2. 사전순으로 정렬한 배열
Collections.sort(answer);
return answer;
}
}
결과
다른 사람이 짠 코드
import java.util.*;
class Solution {
public String[] solution(String myString) {
return Arrays.stream(myString.split("x")).filter(s -> !s.isEmpty()).sorted().toArray(String[]::new);
}
}
- Arrays.stream(myString.split("x")) : 문자열을 "x"를 기준으로 분리한 후, 분리된 문자열을 스트림으로 변환
- .filter(s -> !s.isEmpty()) : 스트림에서 빈 문자열을 제거합니다. 즉, 문자열의 길이가 0이 아닌 경우만 유지
- .sorted() : 스트림에서 요소를 사전순으로 정렬
- .toArray(String[]::new) : 정렬된 스트림 요소를 문자열 배열로 변환
'Coding Test > 프로그래머스' 카테고리의 다른 글
[Java] 문자열이 몇 번 등장하는지 세기 (0) | 2024.03.18 |
---|---|
[Java] 문자열 뒤집기 (0) | 2024.03.17 |
[Java] 피자 나눠 먹기 (2) (0) | 2024.02.02 |
[MySQL] 어린 동물 찾기 (0) | 2023.12.06 |
[JavaScript] 멘토링 (0) | 2023.11.25 |