우선 문자열 문제였고 문제에서 친절하게? 각 단계별로 해야할 과정이 명시되어 있었다.
(예전에 비슷한 문제를 네이버 부스트캠프에서 풀어본 것 같다.)
1단계 : new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
-> toLowerCase를 사용하면 될것이라 판단
2단계 : 2단계 newid에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(), 마침표(.)를 제외한 모든 문자를 제거합니다.
-> 여기서 replaceAll 메소드를 사용하면 되는것은 알았지만 정규표현식을 쓸 생각을 못하였다. 물론 정규표현식에 대한 이해가 많이 부족하다.
3단계 : new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
-> 여기서도 정규표현식을 통해 replaceAll로 치환할 수 있다.
4단계 : new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
-> 여기서도 정규표현식을 통해 replaceAll로 치환할 수 있다.
5단계 : new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
-> new_id의 길이를 파악하고 0일때 대입하였다.
6단계 : new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
-> new_id의 길이를 재고 subString을 통해 추출 후 마침표 문자 체크 후 제거
7단계 : new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
-> while문을 통해 subString으로 추출한 후 반복하여 + 함
사실 이문제는 정규표현식에 대한 이해가 많이 부족했고 조금 더 디테일하게 공부를 해야겠다는 생각도 들었다. 해답을 보고 문제를 풀었기 때문에 다시한번 도전해봐야겠다.
package Problem;
import java.util.Locale;
public class 신규아이디추천 {
public static void main (String[]args){
String s = "\"...!@BaT#*..y.abcdefghijklm";
//System.out.println(s);
solution(s);
}
private static String solution(String temp) {
String answer = "";
String new_id = "z-+.^.";
//단계별로 과정을 거침
//1단계 toLowerCase
temp = temp.toLowerCase();
new_id = new_id.toLowerCase();
//2단계 특수문자 제거
//String match = "^[!]+$";
System.out.println(new_id);
//[]중괄호 안에 ^가 있을 때는 not이라는 뜻
new_id = new_id.replaceAll("[^a-z0-9-_.]","");
System.out.println(new_id);
//3단계 ... 과 .. 을 .으로 변경
String match = "[.]{2,}";
new_id = new_id.replaceAll("[.]{2,}",".");
//new_id.replaceAll("bat",".");
System.out.println(new_id);
//4단계 처음위치한 . 제거
//[]중괄호 밖에 ^가 있을 때는 시작하는 문자를 표시 $는 끝나는 문자표시
System.out.println("4단계");
new_id = new_id.replaceAll("^[.]|[.]$","");
System.out.println(new_id);
//5단계 빈문자열이면 a대입
if(new_id.length() == 0){
new_id +="a";
}
//6단계 길이가 16자 이상이면, 첫 15개 제외한 나머지 문자 모두 제거
if(new_id.length() >= 16){
new_id = new_id.substring(0,15);
}
new_id = new_id.replaceAll("[.]$","");
System.out.println("new_id : "+new_id);
//7단계 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이될 때까지 반복해서 끝에 붙임
if(new_id.length() <= 2){
while(new_id.length() < 3) {
String ch = new_id.substring(new_id.length() - 1, new_id.length());
new_id += ch;
}
}
System.out.println("new_id 7단계 : "+new_id);
return answer;
}
}