코딩테스트연습/[프로그래머스] Java

[프로그래머스] Java 코딩테스트 연습 - 문자열 잘라서 정렬하기

_꼬마돌 2023. 6. 24. 16:00
반응형

[프로그래머스] Java 코딩테스트 연습 - 문자열 잘라서 정렬하기

문제 출처

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

문자열 myString이 주어집니다. "x"를 기준으로 해당 문자열을 잘라내 배열을 만든 후 사전순으로 정렬한 배열을 return하는 solution 함수를 완성해 주세요. 
단, 빈 문자열은 반환할 배열에 넣지 않습니다. 

 

풀이

첫 번째 풀이,,

import java.util.Arrays;

class Solution {
    public String[] solution(String myString) {
        String[] splitArr = myString.trim().split("x");
        String[] answer = new String[splitArr.length];
        
        for (int i = 0; i < splitArr.length; i++) {
            answer[i] = Arrays.sort(splitArr[i]);
        }
        
        return answer;
    }
}

엄청나게 긴 오류 메세지와 함께 틀려버린 답.

찾아보니, sort() 메서드는 return type이 void이기 때문에 answer 변수에 저장할 필요가 없다.
그리고 배열안의 요소 하나 하나가 아닌 배열 자체를 인수로 줘야한다.
=> for 반복문으로 배열 하나하나를 순회할 필요가 없다 !

두 번째 풀이,,

import java.util.Arrays;

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

첫 번째 풀이에서 발견한 문제들을 개선했다. 
answer 변수와 for 반복문을 없애버렸다. 깔끔하다..!


테스트 1
입력값 〉	"axbxcxdx"
기댓값 〉	["a", "b", "c", "d"]
실행 결과 〉	테스트를 통과하였습니다.
테스트 2
입력값 〉	"dxccxbbbxaaaa"
기댓값 〉	["aaaa", "bbb", "cc", "d"]
실행 결과 〉	테스트를 통과하였습니다.


코드 실행 테스트에서는 2개 테스트 모두 성공이라며,,,
근데 왜 채점에서는 전부 실패야?????

테스트 3
입력값 〉	"chrxyuixrex"
기댓값 〉	["chr", "re", "yui"]
실행 결과 〉	테스트를 통과하였습니다.
테스트 4
입력값 〉	"uuuxoooxqqxz"
기댓값 〉	["ooo", "qq", "uuu", "z"]
실행 결과 〉	테스트를 통과하였습니다.

두 개의 테스트 케이스를 임의로 추가해서 돌려봐도 통과,,
하지만 채점만 하면 어김없이 빵점ㅋㅋ뭔데이거

테스트 3
입력값 〉	"chrxyuixxrex"
기댓값 〉	["chr", "re", "yui"]
실행 결과 〉	실행한 결괏값 ["","chr","re","yui"]이 기댓값 ["chr","re","yui"]과 다릅니다.

이거다.. x가 연속으로 주어질 때 빈 배열이 출력되는 게 문제였다.

분명 빈 배열이 출력되는 걸 방지하기 위해서 trim() 메서드를 추가했었는데 어떻게 된건가 싶어서 좀 찾아보니 trim() 메서드는 배열에는 사용할 수 없고 String 객체에만 사용할 수 있다는 걸 알게 됐다. 지금까지 아무 의미 없이 붙어 있던 거다,, 그래서 trim() 은 지워버렸다.
splitArr 배열에 빈 배열이 있는지 확인하는 절차를 넣기로 했다. for문으로 splitArr 배열의 각 요소를 isEmpty() 메서드로 확인하고 비어있지 않은 배열만 resultList에 추가하도록 했다.
이제 x를 기준으로 문자열을 잘라 배열을 만들었고, 빈 배열 삭제까지 했으니까 배열을 사전순으로 정렬하기만 하면 된다. 먼저 ArrayList에서 String[] 배열로 변환해주는데, 이때 resultList.size()를 전달해서 resultList의 크기에 맞는 String[] 배열을 생성했다. 그 다음에 변환된 배열이 저장된 resultArr을 Arrays.sort() 메서드로 정렬했다.

length()와 size() 의 차이
length() : String클래스에서 사용되는 메서드. 호출된 문자열의 길이를 반환. String[] 배열에 사용하면 요소 개수를 반환.
size() : Collection 인터페이스를 구현한 컬렉션 클래스 (ArrayList, LinkedList, List 등) 에서 사용되는 메서드. 컬렉션의 요소 개수를 반환.

14점이나 주네 ㅎㅎ 찍어놓을껄 아쉽다.

 

소스코드

import java.util.ArrayList;
import java.util.Arrays;

class Solution {
    public String[] solution(String myString) {
        String[] splitArr = myString.split("x");
        ArrayList<String> resultList = new ArrayList<>();
        
        for (String str : splitArr) {
            if (!str.isEmpty()) {
                resultList.add(str);
            }
        }
        
        String[] resultArr = resultList.toArray(new String[resultList.size()]);
        Arrays.sort(resultArr);
     
        return resultArr;
    }
}

 

반응형