본문 바로가기
코딩테스트

프로그래머스 문자열 잘라서 정렬하기

by dyddyd0 2024. 8. 31.

코딩 기초 트레이닝 문제라 금방 풀 수 있을 줄 알았다.

하지만 

테스트케이스는 통과하지만, 제출 전부 실패하는 일이 계속 발생해서

질문하기를 찾아본 결과 반례를 찾았다.

 

: dxccxbbbxxaaaa와 같이 xx가 연속될 때 split("x")를 하면,

빈값이 저장된 배열이 나오는 경우가 있었다.

 

->

 

x와 x 사이를 나누고 빈값을 저장하지 않도록 하기 위해 다음과 같은 풀이를 생각해 냈다.

 

새 배열로 저장하는 방식--

 

 

- 코드 -

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;

// 프로그래머스 코딩테스트 연습 > 코딩 기초 트레이닝 > 문자열 잘라서 정렬하기
public class Programmers_StringSplitSort {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        String myString = br.readLine();
        br.close();

        bw.write(Arrays.toString(solution(myString)));
        bw.flush();
        bw.close();

    }
    

    public static String[] solution(String mystring) {
        String[] arr = mystring.split("x");
        int n = 0;

        for (int i = 0; i < arr.length; i++){
            if (!arr[i].isEmpty()){
                arr[n] = arr[i];
                n++;
            }
        }
        
//// 반례 : dxccxbbbxxxaaaa
//// n을 정의하고 새 배열 result 를 만든 이유 :
//// arr.length 를 그대로 result 배열의 크기로 가져오게 되면
//// arr.length = 5 일때 result 배열의 크기도 5로 가져와지는데
//// 실제 저장은 다음과 같이: [aaaa, bbb, cc, d, ] 마지막 값에 아무것도 안들어간 배열이 생성되어
//// arr[i] 가 빈값이 아닌경우의 크기를 가져오려고 for 문 안에 n++ 카운트세서
//// result[n] 으로 만들어줌

        String[] result = new String[n];
        for (int i = 0; i < n; i++){
            if (!arr[i].isEmpty()){
                result[i] = arr[i];
            }
        }
        Arrays.sort(result);
        return result;
    }


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

 

- 설명 -
매개변수로 받은 myString을 x로 split 하여 문자열 배열 arr로 저장.

스플릿 한 arr 배열의 길이만큼 for 문을 돌며 

arr [0] 번부터 빈값이 아닌 값을 새롭게 저장해 준다.

 

두 번째 for문에서 solution 함수에서 최종 리턴할 result [] 배열을 만들어주고,

위에서 새로 만든 arr []의 값이 빈값이 아닐 때 result 배열에 넣어준다.

그 이후 Arrays.sort() 함수를 사용하여 리턴해주면 정렬된 배열을 받을 수 있다.

--

두 방식으로 제출을 하고 생각해 보니

첫 번째 for 문에서

arr [i]와 arr [n]을 새로 저장해 줄 필요가 없을 것 같다는 생각이 들었다.

배열의 크기는 어차피 그대로라 빈값이 들어있을 테니

값이 든 개수만 확인해 n 값만 정해서 result 배열의 크기로 지정해 주면 될 듯하다. 

 

 

- 결과 -

 

 

 

문제를 풀고   굳이 null이 아닌 값을 카운트(n++)해 new String [n]을 만들지 않고,

동적으로 배열을 만들고 싶어서 ArrayList <>를 사용해 보았다.

 

 

ArrayList 이용하는 방식--
(+ StringTokenizer 같이 사용해 봄)

 

 

- 코드 -

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;

// 프로그래머스 코딩테스트 연습 > 코딩 기초 트레이닝 > 문자열 잘라서 정렬하기
public class Programmers_StringSplitSort {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        String myString = br.readLine();
        br.close();

        bw.write(Arrays.toString(solution(myString)));
        bw.flush();
        bw.close();

    }


    public static String[] solution(String mystring) {
        List<String> result = new ArrayList<>();

        StringTokenizer st = new StringTokenizer(mystring, "x");

        System.out.println("토큰 갯수 새는 메서드: st.countTokens() : " + st.countTokens());
//      ㄴ나중에 알아낸 메서드 이런게 있더라~


        while (st.hasMoreTokens()){
            result.add(st.nextToken());
        }

        String[] rst = result.toArray(new String[0]);
        Arrays.sort(rst);
        System.out.println(Arrays.toString(rst));

        return rst;
    }

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

 

- 설명 -

동적크기를 갖는 ArrayList <String> result를 선언했다.

StringTokenize를 이용해 x를 기준으로 토큰화시켜준다.

st에 토큰이 더 이상 존재하지 않을 때까지 ArrayList result에 토큰을 저장하고,

String []을 리턴해야 되기 때문에 String [] rst를 만들어서 ArrayList를 String 형태의 배열로 변환해 주었다.

그 이후 정렬 함수를 사용해 리턴하면 끝.

 

 

- 결과 -

 

반응형

'코딩테스트' 카테고리의 다른 글

백준 10845번 큐  (0) 2024.07.05
백준 10828번 스택  (0) 2024.06.30
백준 11720번 숫자의 합  (0) 2024.06.19