프로그래머스 - 코딩테스트

[Java][프로그래머스] - LVL.0 모음 제거

Denny Code 2023. 2. 3. 11:34


정답 1

이문제는 딱 느낌이 왔다. 일딴 Stream 으로 만들어서 filter 를 돌려 모음들만 제거해야겠다는 구상을 한뒤 아래와 같이 답안 로직을 구성해보았다.

import java.util.Arrays;
import java.util.stream.Collectors;

class Solution {
    public String solution(String my_string) {
        return Arrays.stream(my_string.split("")).filter(d -> {
            for (String s : new String[] { "a", "e", "i", "o", "u" }) {
                if (s.equals(d)) {
                    return false;
                }
            }
            return true;
        }).collect(Collectors.joining());
    }
}

하지만 내가 구성한 답안 로직은 뭔가 깔끔하지 못해 많이 아쉬웠다.

 

먼저 String[] 배열을 만들고 Stream 으로 변환시킨뒤 filter 를 돌려 모음들을 제거하고 collect()Collectors.joining() 을 사용해 String 으로 재조립해준뒤 반환하였다.

 

결과는 정답이였다.

 

여기서 Stream.collect() 에 대해서 조금 알아보고 넘어가야할 것 같다.

Stream.collect() 란 ?
최종 연산 중에서 가장 복잡하시만 유용하게 활용되며 필터링 또는 매핑된 요소들을 새로운 컬렉션에 수집해서 리턴한다. 또한 항상 매겨변수 Collector 와 Collectors 를 가져야 한다.

Stream.collect() 를 연습하여 따로 블로그 글로 한번 다뤄봐야할 것 같다.

 

다른사람들의 정답중 더욱 깔끔하고 아름다운 코드 로직이 있는지 보자.

 


정답 2

와... 분명 저번에 replaceAll 에 regex(정규 표현식) 을 사용해 특정 문자열에서 원한는 문자만 뽑아서 새로운 문자열을 만들었던 기억이 있다. 이부분을 응용했다면 이 문제는 정말 간단하게 해결 됐을 문제였다.

class Solution {
    public String solution(String my_string) {
        String answer = "";

        answer = my_string.replaceAll("[aeiou]", "");

        return answer;
    }
}

정규식으로 [aeiou] "a, e, i, o, u 를 지정해 특정 작업을 하겠다." 란 뜻이다. 그렇기 때문에 여기서는 replaceAll 을 사용해 a, e, i, o, u 를 "" 빈 공백으로 바꿔준것이다. 이렇게 하여 특정 문자열에서 모음만 제거할 수 있는것이다.

 

정말 깔끔한 답안이다.