x 사이의 개수

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

프로그래머스

목록 보기
100/169

문제 설명

문자열 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()을 잘 떠올리지 못했다 처음엔.. 😭 또한 아직 배열의 '길이'와 '인덱스'간의 차이를 복잡해지는 순간 헷갈리기 시작한다.. 반복 또 반복 학습이 답인 것 같다.

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

0개의 댓글