TIL&WIL
2023-07-03 TIL (정규식 활용)
blues_jun
2023. 7. 3. 21:13
알고리즘 문제를 해결할 때에 정규식을 사용하는 경우가 정말 많다.
그런데, 막상 문제를 보면 정규식을 사용하면 정말 간단하게 해결할 수 있겠다라는 생각이 들지 않는다.
이 기회에 오늘 풀었던 문제 중에서 정규식으로 바꾸면 더 좋은 부분을 기록해 두려 한다.
우선 조건은 주어진 id에서 마침표가 2번 이상 연속된 부분을 하나의 마침표로 치환하는 것이다.
내가 생각했던 방법은 다음과 같다.
- 주어진 id와 길이가 같은 dot 문자열을 만든다.
- replace 메서드를 활용해서 dot문자열과 같은 부분이 있으면 "."으로 치환한다.
- dot의 문자열의 길이를 하나씩 줄여나간다.
String dot = "";
for (int i=0; i<new_id.length(); i++) {
dot += ".";
}
System.out.println(dot);
while (dot.length()>=2) {
new_id = new_id.replace(dot, ".");
dot = dot.substring(1);
}
위와 같은 방법으로 코드를 구현했는데 정규식을 사용하면 엄청 간단하게 해결할 수 있었다.
s = s.replaceAll("[.]{2,}", ".");
{n,}은 바로 앞에 있는 문자가 n번 이상 반복되는 것을 가리킨다.
즉 2번 이상 반복되는 문자열을 모두 "."으로 치환하는 것이다.
두번째 조건은 주어진 id에서 마침표가 처음이나 끝에 위치한다면 제거하는 것이다.
나는 substring을 사용했다.
if(new_id.charAt(0) == '.') {
new_id = new_id.substring(1);
}
if(new_id.length() != 0 && new_id.charAt(new_id.length()-1) == '.') {
new_id = new_id.substring(0, new_id.length()-1);
}
s = s.replaceAll("^[.]|[.]$", "");
정말.. 한줄로 해결이 가능하다. ^는 []안이 아니므로 시작이라는 뜻, $는 끝이라는 뜻이다. |는 또는이라는 뜻!
코드를 간결하고 가독성 좋게 만드는 것은 언제나 어려운 것 같다..
더 생각하고 고민하자