본문 바로가기
Coding Test/프로그래머스

[Java] 문자열 잘라서 정렬하기

by 노 코딩 노 라이프 2024. 3. 13.

문제설명

문자열 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);
    }
}
  1. Arrays.stream(myString.split("x")) : 문자열을 "x"를 기준으로 분리한 후, 분리된 문자열을 스트림으로 변환
  2. .filter(s -> !s.isEmpty()) : 스트림에서 빈 문자열을 제거합니다. 즉, 문자열의 길이가 0이 아닌 경우만 유지
  3. .sorted() : 스트림에서 요소를 사전순으로 정렬
  4. .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