Skip to main content

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

https://school.programmers.co.kr/learn/courses/30/lessons/181866

  • 문자열 myString이 주어진다.
  • "x"를 기준으로 해당 문자열을 잘라내 배열을 만든 후 사전순으로 정렬한 배열을 return
  • 단, 빈 문자열은 반환할 배열에 넣지 않는다.

  • 1 ≤ myString ≤ 100,000
    • myString은 알파벳 소문자로 이루어진 문자열이다.

정답코드

import java.util.*;

class Solution {
    public String[] solution(String myString) {
        // 1. "x" 기준으로 자르기
        String[] splited = myString.split("x");
        
        // 2. 빈 문자열 제거
        List<String> list = new ArrayList<>();
        for (String s : splited) {
            if (!s.isEmpty()) {
                list.add(s);
            }
        }
        
        // 3. 오름차순 정렬
        Collections.sort(list);
        
        // 4. list → String[]
        return list.toArray(new String[0]);
    }
}
  1. "x"를 기준으로 문자열을 나눠서 배열로 만든다.
  2. split 후 생길 수 있는 ""(빈 문자열)을 제외한다.
  3. 남은 문자열들을 오름차순(사전순)으로 정렬한다.

오답

import java.util.*;

class Solution {
    public String[] solution(String myString) {
        String[] answer = myString.split("x");
        Arrays.sort(answer);
        
        return answer;
    }
}

image.png

image.png

문제에 빈 문자열은 포함하지 않는다는 조건이 있는데 해당 처리를 하지 않아서 테스트를 통과하지 못했다. 그래서 빈 문자열 제거하는 로직을 넣어서 수정했다. 빈 문자열 제거는 배열로는 안되고 몇 개가 제거될 지 모르기 때문에 가변리스트 ArrayList 를 선언했다. split()메서드로 나눈 배열을 순회하며 요소가 비어있지 않을 때만 List에 추가했다. 그 후 List를 String[]으로 변환해서 반환했다.


Stream을 활용한 코드

import java.util.*;

class Solution {
    public String[] solution(String myString) {
        return Arrays.stream(myString.split("x"))
                     .filter(s -> !s.isEmpty())
                     .sorted()
                     .toArray(String[]::new);
    }
}
  • 문자열 자르기
    myString.split("x")"x" 기준 나눔
  • 빈 문자열 제거
    .filter(s -> !s.isEmpty())로 공백 요소 제거
  • 사전순 정렬
    .sorted()로 오름차순 정렬
  • 배열로 변환
    .toArray(String[]::new)로 다시 String[] 배열로 리턴