

<풀기 전 생각>
특정 문자열의 패턴을 검사하는 것 이므로 정규식을 활용해야 한다는 생각을 할 수 있고
문자열을 합치고 제거하는 과정이 빈번하게 일어날 것 같기에 StringBuilder 클래스를 활용해야 겠다는 생각을 하고 문제 풀이에 들어 갔다.
<최종 코드>
class Solution {
// 시간 복잡도 O(n) 공간 복잡도 O(n)
public String solution(String new_id) {
// step 1
// 모든 대문자를 대응되는 소문자로 치환합니다.
new_id=new_id.toLowerCase();
// step 2
// 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
new_id=new_id.replaceAll("[^[a-z][0-9]-._]","");
// step 3
// 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
StringBuilder ans = new StringBuilder();
for (int i = 0; i < new_id.length()-1; i++) {
if(new_id.charAt(i)=='.'&&new_id.charAt(i+1)=='.')
continue;
ans.append(new_id.charAt(i));
}
if(new_id.charAt(new_id.length()-1)!='.')
ans.append(new_id.charAt(new_id.length()-1));
// new_id=new_id.replaceAll("[.]{2,}",".");
// step 4
// new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
if(ans.length()!=0){
if(ans.charAt(0)=='.')
ans.deleteCharAt(0);
if(ans.charAt(ans.length()-1)=='.')
ans.deleteCharAt(ans.length()-1);
}
// new_id=new_id.replaceAll("^[.]|[.]$","");
// step 5
// new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
if(ans.length()==0)
ans.append("a");
// step 6
// new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
if(ans.length()>=16)
ans.delete(15,ans.length());
// 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
if(ans.charAt(ans.length()-1)=='.')
ans.deleteCharAt(ans.length()-1);
// step 7
// new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
if(ans.length()<=2)
while(ans.length()<3){
ans.append(ans.charAt(ans.length()-1));
}
return ans.toString();
}
}
<메모>
정규식을 복습하고 공부하는데 최적인 문제가 아닐까 싶어서 종종 정규식이 헷 갈린 다면 다시 공부하는 차원에서 풀면 좋을 것 같다.
확실한 건 문자열 패턴 -> 정규식
<정규식 관련 정리가 잘된 글 링크>
'PS > Level1' 카테고리의 다른 글
| Programmers School level 1: 실패율 (1) | 2023.01.31 |
|---|---|
| Programmers School level 1: [1차] 비밀지도 (1) | 2023.01.26 |
| Programmers School level 1: 성격 유형 검사하기 (1) | 2023.01.22 |
| Programmers School level 1: 신고 결과 받기 (1) | 2023.01.20 |
| Programmers School level 1: 숫자 문자열과 영단어 (0) | 2023.01.18 |