이해 중에 끄적인 낙서...
import java.util.*;
class Solution {
public String solution(String new_id) {
String answer = "";
char c; int i;
ArrayList <Character> list = new ArrayList<>();
StringBuilder sb = new StringBuilder();
// <1단계>
new_id = new_id.toLowerCase();
// <2단계>
for (i=0; i<new_id.length(); i++){
c = new_id.charAt(i);
if (('a'<=c && c<='z') || ('0'<=c && c<='9') || c=='-' || c=='_' || c=='.'){
list.add(c);
}
}
// <3단계>
i=1;
while(i<list.size()){
if (list.get(i)=='.' && list.get(i-1)=='.'){
list.remove(i);
}
else i++;
}
// <4단계>
if (list.get(0)=='.') list.remove(0);
if (!list.isEmpty()){
if (list.get(list.size()-1)=='.') list.remove(list.size()-1);
}
// 여기에서부터는 길이에 따라 단계가 달라짐
Iterator<Character> it = list.iterator();
if (list.isEmpty()){ // <5단계>
return "aaa";
}
else if (list.size()==1){ // <7단계>
return list.get(0).toString()+list.get(0).toString()+list.get(0).toString();
}
else if (list.size()==2){ // <7단계>
return list.get(0).toString()+list.get(1).toString()+list.get(1).toString();
}
else if (list.size()<=15) {
while (it.hasNext()) sb.append(it.next());
}
else if (list.get(14)=='.'){ // <6단계인데 마지막 문자가 '.' 인 경우
for(i=0; i<14; i++) sb.append(it.next());
}
else { // <6단계>
for(i=0; i<15; i++) sb.append(it.next());
}
answer = sb.toString();
return answer;
}
}
ArrayList의 remove, add, get 등 이용
문제에서 제시한 풀이 단계를 주석으로 달아 놨다.
다른 분 코드에서 정규표현식으로 나타내신 걸 보고 코드를 고쳐 봤다. 너무 깔끔해짐...
class Solution {
public String solution(String new_id) {
String answer = new_id.toLowerCase(); // <1단계>
answer = answer.replaceAll("[^-_.a-z0-9]",""); // <2단계>
answer = answer.replaceAll("[.]{2,}","."); // <3단계>
answer = answer.replaceAll("^[.]|[.]$",""); // <4단계>
if(answer.equals("")) answer += "a"; // <5단계>
if(answer.length() >=16){ // <6단계>
answer = answer.substring(0,15);
answer = answer.replaceAll("^[.]|[.]$",""); // 맨 마지막이 .인 경우
}
if(answer.length()<=2){ // <7단계>
while(answer.length()<3)
answer += answer.charAt(answer.length()-1);
}
return answer;
}
}
참고 블로그
📌 String replace(CharSequnce target, CharSequence replacement)
String a = "무궁화 삼천리 화려강산 대한사람 대한으로 길이 보전하세 "; //replace([기존문자],[바꿀문자]) a = a.replace("대한", "민국"); System.out.println(a); //결과값 : 무궁화 삼천리 화려강산 민국사람 민국으로 길이 보전하세
📌 String replaceAll(String regex, String replacement)
String a = "무궁화 삼천리 화려강산 대한사람 대한으로 길이 보전하세 "; //replaceAll([정규식],[바꿀문자]) a = a.replaceAll("대한", "민국"); System.out.println(a); //결과값 : 무궁화 삼천리 화려강산 민국사람 민국으로 길이 보전하세 String a = "무궁화. 삼천리. 화려강산. 대한사람. 대한으로. 길이. 보전하세 "; a = a.replaceAll(".", "/"); System.out.println(a); //결과값 : /////////////////////////////////////
📌 정규표현식
참고 블로그
answer = answer.replaceAll("[^-_.a-z0-9]",""); // <2단계>
// [^-_.a-z0-9] : 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자
answer = answer.replaceAll("[.]{2,}","."); // <3단계>
// [.]{2,} : "."문자가 2개 이상 반복됨
// 꼭 [] 안에 써서 "." 문자임을 나타내야 됨 마침표(.)는 모든 문자를 뜻한다
answer = answer.replaceAll("^[.]|[.]$",""); // <4단계>
// ^[.]|[.]$ : 처음이나 끝에 위치하는 마침표(.)
2~4단계에서 사용했던 정규식을 정리해봤다