[Programmers] level 1 - 신규 아이디 추천 (2021 KAKAO BLIND RECRUITMENT)

Lynn·2021년 2월 18일
0

Algorithm

목록 보기
34/43
post-thumbnail

👩🏻‍💻 문제


이해 중에 끄적인 낙서...

👩🏻‍💻 정답 코드

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;
    }
}

👩🏻‍💻 Remember

참고 블로그
📌 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단계에서 사용했던 정규식을 정리해봤다

profile
wanderlust

0개의 댓글