문자열 잘라서 정렬하기

nacSeo (낙서)·2024년 2월 25일
0

프로그래머스

목록 보기
101/169

문제 설명

문자열 myString이 주어집니다. "x"를 기준으로 해당 문자열을 잘라내 배열을 만든 후 사전순으로 정렬한 배열을 return 하는 solution 함수를 완성해 주세요.

단, 빈 문자열은 반환할 배열에 넣지 않습니다.

제한사항

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

나의 코드

  • 첫 번째 코드
import java.util.Arrays;

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

코드 실행 시 모든 테스트를 통과했지만, 제출 후 채점하기에서 테스트 다 실패... 뭐 때문일까 🤔 라고 생각하면서 문제를 다시 읽어보니 단, 빈 문자열은 반환할 배열에 넣지 않습니다.라고 되어있다. x를 기준으로 split을 하면 연속된 x가 있으면 빈 문자열이 생성된다. 이것을 제거하는 코드를 추가해야 했다.

  • 최종 코드
import java.util.Arrays;
import java.util.ArrayList;

class Solution {
    public String[] solution(String myString) {
        String[] answer = myString.split("x");
        ArrayList<String> list = new ArrayList<>();
        for(int i=0; i<answer.length; i++) {
            if(!answer[i].isEmpty()) {
                list.add(answer[i]);
            }
        }
        answer = new String[list.size()];
        for(int j=0; j<list.size(); j++) {
            answer[j] = list.get(j);
        }
        Arrays.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);
    }
}

stream 사용

import java.util.*;

class Solution {
    public String[] solution(String myString) {
        StringTokenizer st = new StringTokenizer(myString, "x");
        int idx = 0, N = st.countTokens();
        String[] result = new String[N];
        for (int n = 0;n < N;n++)
            result[idx++] = st.nextToken();
        Arrays.sort(result);
        return result;
    }
}

StringTokenizer 사용

import java.util.*;

class Solution {
    public String[] solution(String myString) {
        String[] splitStrings = myString.split("x");
        List<String> resultList = new ArrayList<>();
        for (String s : splitStrings) {
            if (!s.equals("")) {
                resultList.add(s);
            }
        }
        String[] resultArray = new String[resultList.size()];
        resultList.toArray(resultArray);
        Arrays.sort(resultArray);
        return resultArray;
    }
}

향상된 for문 사용

느낀 점

우선, 좀 더 문제를 꼼꼼히 읽어야겠다고 생각이 들었다 😭 다른 사람 코드에서 streamStringTokenizer는 아직 익숙한 방식이 아니라 사용하기 부담스럽지만 계속 눈으로 익히면서 익숙해지도록 할 예정! 또한, 향상된 for문도 아직 익숙하지 않은데 가독성좋고 인덱스문제를 해결할 수 있다는 장점이 존재하기 때문에 필요할 때 사용할 수 있도록 노력해봐야겠다.

내가 쓴 향상된 for문 블로깅

profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글