본문 바로가기

Java/코딩테스트

[프로그래머스/181862] 세 개의 구분자 (정규표현식, 스트림API, split, stream, filter, toArray)

✏️ 문제 설명

임의의 문자열이 주어졌을 때 문자 "a", "b", "c"를 구분자로 사용해 문자열을 나누고자 합니다.
예를 들어 주어진 문자열이 "baconlettucetomato"라면 나눠진 문자열 목록은 ["onlettu", "etom", "to"] 가 됩니다.
문자열 myStr이 주어졌을 때 위 예시와 같이 "a", "b", "c"를 사용해 나눠진 문자열을 순서대로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.
단, 두 구분자 사이에 다른 문자가 없을 경우에는 아무것도 저장하지 않으며, return할 배열이 빈 배열이라면 ["EMPTY"]를 return 합니다.

 


✏️ code

🖥️ 스트림 API

  • 도입: Java 8
  • 정의: 데이터 소스(컬렉션, 배열 등)에서 추출된 연속된 요소들의 모음입니다.
  • 목적: 복잡한 데이터 처리 작업을 간결하고 효율적으로 수행합니다.
  • 주요 메서드
    • 스트림 생성
      • Stream<String> stream = Stream.of("apple", "banana"); 주어진 값으로 스트림 생성
      • String[] array = {"apple", "banana"};
        Stream<String> stream = Arrays.stream(array); 배열을 스트림 변환
      • List<String> list = Arrays.asList("apple", "banana");
        Stream<String> stream = list.stream(); 컬렉션(ex: List, Set)을 스트림 변환
    • 중간 연산
      • String<String> filteredStream = stream.filter(s -> s.startsWith("a"); 조건에 맞는 요소만 필터링하여 새로운 스트림 반환
      • String<String> upperCaseStream = stream.map(String::toUpperCase); 각 요소를 반환하여 새로운 스트림 반환
      • Stream<String> sortedStream = stream.sorted(); 정렬
      • Stream<String> distinctStream = stream.distinct(); 중복 요소 제거
      • Stream<String> limitedStream = stream.limit(2); 스트림 크기 제한
      • Stream<String> skippedStream = stream.skip(1); 처음 n개의 요소를 건너뛰고 나머지 요소 반환
    • 최종 연산
      •  stream.forEach(s -> System.out.println(s)); 각 요소에 대한 동작 수행
      • List<String> list = stream.collect(Collectors.toList()); 스트림의 요소를 컬렉션 형태로 반환
      • Optional<String> result = stream.reduce((s1, s2) -> s1 + s2); 스트림 요소를 결합하여 하나의 값으로 만듦
      • long count = stream.count(); 스트림 요소 개수 반환
      • boolean hasB = stream.anyMatch(s -> s.startsWith("b")); 스트림 요소 중 하나라도 조건 만족하는지 확인
      • boolean allStartA = stream.allMatch(s -> s.startsWith("a")); 스트림 모든 요소가 조건 만족하는지 확인
      • boolean noneStartC = stream.noneMatch(s -> s.startsWith("c")); 스트림 모든 요소가 조건 만족하지 않는지 확인

📌 String[] answer = myStr.split("[abc]");

  • myStr.split("[abc]")
    • 정규표현식 'a', 'b', 'c' 중 하나가 나타날 때마다 해당 위치에서 문자열을 나눕니다.

📌 if (answer.length == 0) {return new String[]{"EMPTY"};}

  • answer.length == 0: 만약 answer 배열이 비어 있으면, 즉 split 결과 아무것도 없다면 EMPTY 문자열을 포함하는 배열을 반환합니다.

📌 Arrays.stream(answer).filter(s -> !s.isEmpty()).toArray(String[]::new);

  • Arrays.stream(answer): answer 배열을 스트림으로 변환합니다.
  • .filter(s -> !s.isEmpty()): 빈 문자열을 제외한 채 필터링합니다.
  • .toArray(String[]::new): 필터링된 결과를 다시 String[] 배열로 반환합니다.
import java.util.Arrays;

class Solution {
    public String[] solution(String myStr) {
        String[] answer = myStr.split("[abc]");
        
        if (answer.length == 0) {
            return new String[]{"EMPTY"};
        }
        
        return Arrays.stream(answer)
                     .filter(s -> !s.isEmpty())
                     .toArray(String[]::new);
    }
}
반응형