오늘 풀은 문제는 "정규식"에 관한 부분이었다.
주요 사용된 메소드들은
String에 관련된 replace, replaceAll, charAt 이 있다.
오늘 문제는 정규식에 관한 부분이 대다수여서 크게 오래 걸리거나 하진 않았지만,
정규식은 머리에 외우고 다니지도 않고, 많이 써보지도 않아서인지 구글링을 좀 했다 ㅎ
new_id = new_id.toLowerCase();
첫번째로 아이디 입력값에 만약 대문자가 있을 경우에 소문자로 치환해주는 toLowerCase 메소드를 사용해준다.
new_id = new_id.replaceAll("[^a-z0-9-_.]", "");입력하세요
그 다음으론 replaceAll을 이용해, 해당 id 안에는 알파벳, 숫자, -, _, . 만 들어가야 함으로
정규식을 이용해서 그외의 문자열들을 공백으로 만들어준다.
여기서 문자열 치환 메소드는 보통 2개인데
replace 와 reaplceAll 이 있다.
이 두 메소드의 차이점은 매개변수에 있는데,
String replace(CharSequnce target, CharSequence replacement)
String replaceAll(String regex, String replacement)
replace 는 일반 문자열을 찾아서 치환해주고,
replaceAll 은 정규식형태의 String 값을 넣어준다.
(CharSequence 는 String을 포괄하는 인터페이스)
아무튼 다음 코드 설명으로 넘어가면
while(new_id.contains("..")) {new_id = new_id.replace("..", ".");}
이번엔 굳이 replaceAll을 사용하진 않았다.
정규식을 안쓸거니깐!!
.. 을 . 으로 바꿔주는 형태인데,
... 인 경우는 한번밖에 치환을 안해줘서 남는 경우가 있으니
.. 이 없어질때 까지 반복문을 돌려주는 형태로 작성했다.
어.. 근데 이거 글쓰면서 생각난건데, CharSequence가 String을 상속하는 인터페이스라면, replace에서도 replaceAlㅣ에서 사용하는 정규식을 사용 할 수 있어야 하는거 아닌가?
하고 사용해 봤는데... 뭔가 제대로 되지 않는다.
내 생각이 틀린건가? 하고 생각이 들어서 찾아봤는데,
그게아니고 그냥 String 안에 있는 toString 메소드가 오버라이딩 되어있는 형태인것같다...
아 진짜 인터페이스는 아직도 잘 모르겠다 ㅎ 이해가 갈랑말랑...
아무튼 다음으로.
new_id = new_id.replaceAll("^[.]*", "");
new_id = new_id.replaceAll("[.]$", "");
아이디의 처음과 마지막에 . 이 들어가지 않도록 지워주는 작업이다.
흠.. 이것도 한줄로 바꾸는거 가능할거같은데, 조금 더 공부 해 봐야지.
if("".equals(new_id)) new_id = "a";
만약에 아이디가 빈 문자열로 들어오게 되는경우엔, a 한글자를 할당해준다.
if(new_id.length() > 15) new_id = new_id.substring(0, 15);
아이디가 15글자를 넘어 갈 경우엔 15자리 까지만 끊어준다.
new_id = new_id.replaceAll("[.]$", "");
만약에 15자리 까지 끊어줬는데, . 이 마지막에 올 경우가 있을수도 있으니 한번 더 제거 해 준다.
if(new_id.length() < 3) {
char lastC = new_id.charAt(new_id.length()-1);
while(new_id.length() < 3) {new_id = new_id + lastC;}
}
그리고 마지막으로 3자리 이하 일 때
마지막 char를 사용해서 3자리가 될때 까지 id 에 추가 해 주도록 한다.
이렇게 하면 끝!
다른 분들의 문제 풀이도 한번 봤는데, 재사용성을 생각하고 푸신 분의 풀이를 보니
아.. 이게 자바의 장점인데도 난 왜 문제 푸는데 급급 할까 ㅎㅎ 란 생각이 들더라...
다음 부턴 재사용성도 한번 생각을 해보고 접근 하는게 좋을듯 하다.
예를들면, 위와같이 1~7 단계를 거쳐서 사용 되는 경우에는 각각 메소드들을 만들어 놓고 사용하는것이 유지보수 측면이나 가독성 면에서도 훨씬 좋아지는 느낌이 들었다.
아무튼 완성된 코드는 아래와 같다.
public String solution(String new_id) {
new_id = new_id.toLowerCase();
new_id = new_id.replaceAll("[^a-z0-9-_.]", "");
while(new_id.contains("..")) {new_id = new_id.replace("..", ".");}
new_id = new_id.replaceAll("^[.]", "");
new_id = new_id.replaceAll("[.]$", "");
if("".equals(new_id)) new_id = "a";
if(new_id.length() > 15) new_id = new_id.substring(0, 15);
new_id = new_id.replaceAll("[.]$", "");
if(new_id.length() < 3) {
char lastC = new_id.charAt(new_id.length()-1);
while(new_id.length() < 3) {new_id = new_id + lastC;}
}
String answer = new_id;
return answer;
}