문제 설명
문자열 myString이 주어집니다. myString을 문자 "x"를 기준으로 나눴을 때 나눠진 문자열 각각의 길이를 순서대로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.
제한사항
1 ≤ myString의 길이 ≤ 100,000 myString은 알파벳 소문자로 이루어진 문자열입니다.
나의 코드
class Solution {
public int[] solution(String myString) {
String[] str = myString.split("x");
int[] answer = new int[str.length];
for(int i=0; i<str.length; i++) {
answer[i] = str[i].length();
}
return answer;
}
}
split()
을 사용하여 x
를 기준으로 문자열 배열로 나타내고, 그만큼의 길이의 정수 배열을 선언하여 문자열 배열 요소마다의 길이를 정수 배열에 넣어줘서 답을 구했다. 그러나 마지막에 x
가 존재하는 경우 0으로 처리되는 것이 생략되었다.
import java.util.Arrays;
class Solution {
public int[] solution(String myString) {
String[] str = myString.split("x");
int[] answer = new int[str.length];
for(int i=0; i<str.length; i++) {
answer[i] = str[i].length();
}
if(myString.endsWith("x")) {
int[] temp = new int[answer.length+1];
temp = Arrays.copyOf(answer, answer.length+1);
temp[temp.length-1] = 0;
answer = temp;
}
return answer;
}
}
주어진 문자열의 마지막 문자가 x
가 올 경우를 endsWith()
메소드를 통해 따로 조건문을 만들어 해결했다. 해결하는 데에 또 길이와 인덱스 간의 차이에 대해 혼동이 있어서 에러를 많이 마주쳤다 X( ,, 많이 문제를 풀면서 얼른 헷갈리지 않게 적응하자..!
다른 사람 코드
import java.util.Arrays;
class Solution {
public int[] solution(String myString) {
return Arrays.stream(myString.split("x", myString.length()))
.mapToInt(x -> x.length())
.toArray();
}
}
import java.util.*;
class Solution {
public Integer[] solution(String myString) {
return Arrays.stream(myString.split("x", -1)).map(String::length).toArray(Integer[]::new);
}
}
두 문제 다 stream
을 사용해서 손 쉽게 해결.. 다른 문제들도 stream
을 사용하면 가독성 좋게 코드가 짜여지는데 이번 문제는 stream
으로 푸는 것과 일반적인 방식으로 푸는 코드 간의 차이가 커서 기록해둬본다!
class Solution {
public int[] solution(String myString) {
String[] result = myString.split("x");
int size = result.length;
if (myString.charAt(myString.length() - 1) == 'x'){
size += 1;
}
int[] answer = new int[size];
for (int i = 0; i < result.length; i++) {
answer[i] = result[i].length();
}
if (myString.charAt(myString.length() - 1) == 'x'){
answer[size - 1] = 0;
}
return answer;
}
}
느낀 점
문제들에 대한 여러 방법들이 있겠지만 그 문제를 보고 어떤 메소드를 사용해서 어떻게 푸는 것이 가장 효과적인 방법일지 고민을 잘 해야겠다. 이번 문제도 바로 split()
을 잘 떠올리지 못했다 처음엔.. 😭 또한 아직 배열의 '길이'와 '인덱스'간의 차이를 복잡해지는 순간 헷갈리기 시작한다.. 반복 또 반복 학습이 답인 것 같다.