-
알고리즘 문제풀때 정규식(Regex)을 쓰는것이 좋을까??알고리즘/알고리즘 Tip! 2020. 4. 20. 23:10
정규 표현식은 특정한 규칙을 가진 문자열의 집합을 표현하기 위해 쓰이는 형식 언어입니다.
하지만, 알고리즘 성능에는 그다지 좋지가 않습니다. 그 이유는 "백트래킹" 때문입니다.
정규식은 왼쪽에서 오른쪽으로 탐색을 하는데 100% 매칭 되지 않으면 다시 뒤로 되돌아가면서 매칭을 시도합니다.
이를 백트래킹이라고 합니다. 자바 같은 경우에는 심지어 컴파일 작업을 거쳐야지만 사용이 가능합니다.
Pattern.compile("ABC").matcher(s).find()
s.contains("ABC")
다음 두 코드 중 어느 게 더 빠를까요??
전자는 컴파일하고 (상대적으로) 복잡한 정규 표현식을 반복하므로 단순히 일련의 문자를 찾는 후자가 조금 더 빠릅니다.
그러면 정규식을 안 쓰는 게 좋지 않는가??
속도만을 생각한다면 맞는 말입니다.
대신 정규식을 사용하면 코드가 굉장히 짧아지는 장점도 있습니다.
다음과 같은 문제를 한번 보겠습니다.
https://programmers.co.kr/learn/courses/30/lessons/12948
이 문제를 다음과 같이 한 줄로 풀이가 가능하게 됩니다.
class Solution { public String solution(String phone_number) { return phone_number.replaceAll(".(?=.{4})", "*"); } }
다른 풀이 보기 : [알고리즘/프로그래머스] - 코딩 테스트 연습 / 연습문제 / 핸드폰 번호 가리기 / JAVA
이 같은 이유 때문에 저희는 정규식을 알고 있으면 여러모로 간편한 점이 많습니다.
실제로 실무에서는 정규식이 다음과 같은 상황에서 주로 쓰입니다.
- 사용자 입력 유효성 검증: 이메일 주소, URL, 전화번호, 주민등록번호
- 패턴에 기반한 감지 및 치환: SQL Injection 탐지, HTML 태그 및 (악성) 스크립트 제거
다음과 같은 복잡하거나 특정 문자열이 쓰인다고 할 때 정규식을 사용하면 코드 10~20줄을 더 줄일 수 있게 돼서
문장이 간결해지고 가독성이 좋아집니다.
그렇다면 정규식은 어떻게 쓰는 걸까요??
Java 경우에는 Pattern, Matcher 객체를 이용해서 원하는 문자열을 탐색할 수 있습니다.
String 객체의 replace도 정규식을 지원하는데 내부적으로는 Pattern, Matcher를 이용하기 때문에 별 차이는 없습니다.
Pattern pattern = Pattern.compile("패턴"); Matcher matcher = pattern.matcher("문장"); while(matcher.find()) { //count++ }
Pattern, Matcher 객체는 보통 이렇게 사용합니다.
그러나 Pattern 객체 같은 경우에는 static, final 등과 같이 써서 재컴파일이 안 일어나게 리팩터링을 해줘서 성능을 조금이라도 개선시키는 것이 좋습니다.
패턴의 내부적으로는 다음과 같이 문자열 양 끝에 "/"(슬래시)를 붙이는 것을 원칙으로 합니다.
"/test/"
아래 주소는 자주 쓰이는 정규식을 모아놓은 사이트입니다~! 정리가 잘 되어 있어 첨부합니다.
'알고리즘 > 알고리즘 Tip!' 카테고리의 다른 글
[JAVA] 큐 구현은 어느것이 적당할까? LinkedList vs ArrayDeque (2) 2020.04.20 [JAVA] 스택(Stack) vs 덱(Deque) (0) 2020.04.19