[프로그래머스/181862] 세 개의 구분자

☑️ 문제

프로그래머스 181862

☑️ 풀이

첫 번째 풀이

//시간: 81.49ms
//메모리: 115MB

import java.util.*;

class Solution {
    public String[] solution(String myStr) {
        String[] answer = {};
        String[] abc = {"a", "b", "c"};
        StringBuilder sb;
        for (int i = 0; i < abc.length; i++) {
            String[] str = myStr.split(abc[i]);
            myStr = String.join("-", str);
        }

        StringTokenizer st = new StringTokenizer(myStr, "-");
        answer = new String[st.countTokens()];
        int idx = 0;
        while(st.hasMoreTokens()) {
            answer[idx++] = st.nextToken();
        }
        return (answer.length == 0) ? new String[]{"EMPTY"} : answer;
    }
}
  • 반복문에서 abc 로 나누어진 문자열 배열을 join 메서드를 사용하여 구분자 - 를 포함한 문자열로 만들었다.
  • 그 후, StringTokenizer 를 사용하여 구분자 - 를 기준으로 answer 배열에 담았다.
  • 만약 answer 배열의 길이가 0이면 EMPTY 문자열을 원소로 가지는 배열을 반환하고, 그렇지 않으면 answer 를 반환하도록 한다.
    • 처음에는 삼항연산자를 return (answer.length == 0) ? {"EMPTY"} : answer; 로 선언하여 에러가 발생하였다.
    • {} 는 배열을 선언할 때 사용하는 문법이고, 배열을 직접 반환할 때는 new String[]{} 를 사용해야 한다는 걸 알았다.

두 번째 풀이

//시간: 147.10ms
//메모리: 108MB

import java.util.*;

class Solution {
    public String[] solution(String myStr) {
        String[] str = myStr.split("[abc]");

        List<String> list = new ArrayList<>();
        for (int i = 0; i < str.length; i++) {
            if (!str[i].equals("")) {
                list.add(str[i]);
            }
        }

        String[] answer = new String[list.size()];
        for (int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i);
        }

        return (answer.length == 0) ? new String[]{"EMPTY"} : answer;
    }
}
  • split() 메서드에 정규식 [abc] 를 사용하여 a, b, c 로 문자열을 구분해주는 방법을 사용하였다.

☑️ 문법 정리

split()

String[] result = 문자열.split(정규식[, 제한값]);
  • 특정 구분자를 기준으로 문자열을 나누어 배열(String[])로 반환한다.
  • 주로 문자열을 특정 패턴(예: 공백, 쉼표, 특정 문자 등)으로 분리할 때 사용한다.
  • 정규식(구분자) : 문자열을 나눌 기준 (예: “ “, “,”, “-”, “[abc]” 등)
  • 제한값(선택적) : 배열의 최대 크기 (생략 가능)
    • 0 또는 생략 → 모든 요소 반환
    • 양수(N) → 최대 N개까지 분리
    • 음수(-1) → 모든 요소 반환 (뒤쪽 공백 문자열도 포함)

split() 예제

  • 기본 사용법

      public class Main {
          public static void main(String[] args) {
              String text = "apple banana cherry";
              String[] words = text.split(" "); // 공백 기준으로 분리
                
              for (String word : words) {
                  System.out.println(word);
              }
          }
      }
        
      // apple
      // banana
      // cherry
    
    • 공백을 기준으로 문자열을 나누어 분리한다.
  • 여러 개의 구분자로 분리 (정규식 사용)

      public class Main {
          public static void main(String[] args) {
              String text = "javaahellobworldcprogram";
              String[] words = text.split("[abc]"); // a, b, c 기준 분리
        
              for (String word : words) {
                  System.out.println(word);
              }
          }
      }
        
      // jav
      // hello
      // world
      // program
    
    • “[abc]” → a, b, c 중 하나라도 등장하면 분리된다.
  • split() 의 제한값 사용

      public class Main {
          public static void main(String[] args) {
              String text = "one,two,three,four,five";
        
              String[] limit2 = text.split(",", 2); // 최대 2개로 분리
              String[] limit3 = text.split(",", 3); // 최대 3개로 분리
              String[] limit0 = text.split(",", 0); // 기본 설정 (모두 포함)
              String[] limitNeg = text.split(",", -1); // 모든 요소 포함 (뒤쪽 빈 문자열도 포함)
        
              System.out.println("Limit 2: " + Arrays.toString(limit2));
              System.out.println("Limit 3: " + Arrays.toString(limit3));
              System.out.println("Limit 0: " + Arrays.toString(limit0));
              System.out.println("Limit -1: " + Arrays.toString(limitNeg));
          }
      }
        
      // Limit 2: [one, two,three,four,five]
      // Limit 3: [one, two, three,four,five]
      // Limit 0: [one, two, three, four, five]
      // Limit -1: [one, two, three, four, five]
    
    • limit 값을 설정하면, 최대 몇 개까지 배열을 나눌지 지정할 수 있다.
    • -1 을 사용하면 공백도 포함하여 모든 요소를 반환한다.

split() 주의사항

  • 연속된 구분자는 빈 문자열을 생성한다.

      public class Main {
          public static void main(String[] args) {
              String text = "apple,,banana,,cherry";
              String[] words = text.split(",");
        
              System.out.println(Arrays.toString(words));
          }
      }
        
      // [apple, , banana, , cherry]
    
    • 쉼표가 연속되면 빈 문자열이 배열에 포함된다.
  • | , . 같은 특수문자는 \\ (이스케이프) 필요

      public class Main {
          public static void main(String[] args) {
              String text = "apple|banana|cherry";
              String[] words = text.split("\\|"); // '|' 기준으로 분리
        
              System.out.println(Arrays.toString(words));
          }
      }
        
      // [apple, banana, cherry]
    
    • | , . , * , + 같은 특수문자는 \\ 를 붙여 사용해야 한다.

String.join()

String result = String.join(구분자, 문자열 배열 또는 리스트);
  • 문자열 배열 또는 리스트의 요소들을 특정 구분자로 연결하여 하나의 문자열로 변환한다.
  • 구분자 : 각 요소 사이에 삽입할 문자열

예제

  • 문자열 배열을 join() 으로 결합

      public class Main {
          public static void main(String[] args) {
              String[] words = {"apple", "banana", "cherry"};
              String result = String.join(",", words); 
              System.out.println(result);
          }
      }
        
      // apple, banana, cherry
    
    • “, “ (쉼표 + 공백) 구분자로 문자열 배열의 요소들을 결합한다.
  • 리스트를 join() 으로 결합

      import java.util.*;
        
      public class Main {
          public static void main(String[] args) {
              List<String> words = Arrays.asList("dog", "cat", "elephant");
              String result = String.join(" - ", words);
              System.out.println(result);
          }
      }
        
      // dog - cat - elephant
    
  • String.join()을 활용한 문제 해결

    문제: 특정 문자(a, b, c)를 기준으로 문자열을 분리한 후 다시 “-” 로 결합하기

      public class Main {
          public static void main(String[] args) {
              String myStr = "abacabc";
              String[] splitResult = myStr.split("[abc]");
              String result = String.join("-", splitResult);
                
              System.out.println(result);
          }
      }
        
      // ---
    
    • “abacabc” 에서 “a” , “b” , “c” 를 기준으로 분리하면 빈 문자열들이 나온다.
    • 이 빈 문자열들을 “-” 로 연결하면 “---” 이 된다.

© 2021. All rights reserved.

yaejinkong의 블로그