프로그래머스

자바) 모음 제거

Jr.고래 2024. 7. 16. 08:58

https://school.programmers.co.kr/learn/courses/30/lessons/120849

모음 제거

정규 표현식의 기초

(문제풀이 후기는 글 마지막에)

필요한 사전 지식

정규 표현식이 뭔지??
들어는 본적이 있는 정도

문제 설명

영어에선 a, e, i, o, u 다섯 가지 알파벳을 모음으로 분류합니다. 문자열 my_string이 매개변수로 주어질 때 모음을 제거한 문자열을 return하도록 solution 함수를 완성해주세요.

제한사항

my_string은 소문자와 공백으로 이루어져 있습니다.
1 ≤ my_string의 길이 ≤ 1,000

가장 먼저 생각난 방법은 for문을 통한 조건검사를 하는 것이다.

class Solution {
    public String solution(String my_string) {

        String answer ="";

        for(int i=0; i<my_string.length(); i++){
            char ch = my_string.charAt(i);

            if(ch=='a'){

            }else if(ch=='e'){


            } ...
            else{
                answer+=ch;
            }

            return answer;

        }

    }
}

my_string의 모든 인덱스를 검사해서 aeiou면 정답이 되는 answer에 추가하지 않는것이다.

그런데 풀이가 직관적이고 효율적이라고 느껴지지 않았다

정규표현식을 쓰면 깔끔할거 같다는 생각이 들어서 정리를 해봤다.

정규 표현식 풀이

public class Solution {
    public String solution(String my_string) {
        // 정규 표현식을 사용하여 모음을 모두 제거합니다.
        return my_string.replaceAll("[aeiou]", "");
    }
}

풀이가 엄청 직관적이게 되었다.

정규표현식을 알고 있다면 위에 풀이보다 훨씬 더 가독성이 있을것이다

  • 정규표현식은 replaceAll 함수를 통해 이용할 수 있다
  • String.replaceAll(String regex, String replacement)
  • 정규표현식 "[aeiou]"는 소문자 모음 "a","e","i","o","u"를 나타낸다

정규 표현식 기초

  • [abc]: 'a', 'b', 'c' 중 하나
  • ^[abc]: 'a', 'b', 'c' 중 하나가 오는 경우
  • [^abc]: 'a', 'b', 'c'를 제외한 문자
  • [a-zA-Z]: 모든 알파벳 문자 (대소문자 포함)
  • .: 모든 문자
  • \d: 숫자 ([0-9]와 동일)
  • \D: 숫자가 아닌 문자 ([^0-9]와 동일)
  • \s: 공백 문자 (스페이스, 탭 등)
  • \S: 공백이 아닌 문자
  • \w: 단어 문자 (알파벳, 숫자, 언더스코어)
  • \W: 단어 문자가 아닌 것
  • ^: 문자열의 시작
  • $: 문자열의 끝
  • \b: 단어 경계
  • \B: 단어 경계가 아닌 곳
  • (abc): 'abc'와 정확히 일치하는 그룹
  • (a|b): 'a' 또는 'b'

자바에서 정규 표현식을 사용할 수 있는 몇 가지 메서드

자바에서는 java.util.regex 패키지를 사용하여 정규 표현식을 처리하는데

이 패키지에는 Pattern 클래스와 Matcher 클래스가 포함되어 있다.

  1. replaceAll: 문자열의 모든 부분을 정규 표현식에 맞게 대체합니다.
  2. matches: 문자열이 정규 표현식에 완전히 일치하는지 확인합니다.
  3. split: 문자열을 정규 표현식에 맞춰 분할합니다.
  4. Pattern 클래스와 Matcher 클래스: 보다 복잡한 정규 표현식 작업을 수행할 때 사용됩니다.

문제풀이 후기

정규표현식도 간단하지만은 않구나라고 느꼈다

정리하면서도 상당히 헷갈린다

정규표현식은 이미 프로그래머스 1회차 풀 때도 많이 봐왔었고 그때는 어찌저찌 다른 방식으로 풀거나

피해갔지만 이제는 피해갈 수 없고 해결하는 방법을 배워야 한다

정규 표현식은 매우 복잡한 패턴도 다룰 수 있을것이다

가장 먼저 떠오른게 이메일 유효성 검증이었다.

앞으로 알고리즘을 더 풀거나 프로젝트를 할 때 정규표현식을 쓰게 된다면 여기에 또 정리해야겠다.

추가)

    return my_string.trim().split("[ ]+");
            return myString.trim().split("\\s+");