반응형
[프로그래머스] Java 코딩테스트 연습 - 문자열 잘라서 정렬하기
문제 출처
https://school.programmers.co.kr/learn/courses/30/lessons/181866
문제
문자열 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;
}
}
반응형
'코딩테스트연습 > [프로그래머스] Java' 카테고리의 다른 글
[프로그래머스] Java 코딩테스트 연습 - rny_string (0) | 2023.06.24 |
---|---|
[프로그래머스] Java 코딩테스트 연습 - 간단한 식 계산하기 (1) | 2023.06.24 |
[프로그래머스] Java 코딩테스트 연습 - x 사이의 개수 (2) | 2023.06.24 |
[프로그래머스] Java 코딩테스트 연습 - ad 제거하기 (2) | 2023.06.24 |
[프로그래머스] Java 코딩테스트 연습 - 공백으로 구분하기 2 (2) | 2023.06.23 |