✏️ 문제 설명
임의의 문자열이 주어졌을 때 문자 "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);
}
}
반응형
'Java > 코딩테스트' 카테고리의 다른 글
[프로그래머스/181846] 두 수의 합 (Integer, Long, BigInteger) (0) | 2025.01.14 |
---|---|
[프로그래머스/181894] 2의 영역 (Arrays.copyOfRange, 리팩토링) (0) | 2025.01.13 |
[프로그래머스/181903] qr code (배열과 String 클래스의 문자 접근 방식이 다른 이유, .charAt()) (0) | 2025.01.03 |
[프로그래머스/181847] 0 떼기 (w. 정규표현식, String.replaceFirst()) (0) | 2024.12.30 |
[코드트리/NL] 중복되지 않는 정수 중 최대 (w. HashMap, Math.max) (0) | 2024.12.29 |