프로그래머스 [신규 아이디 추천] - 72410

2022. 1. 23. 10:15프로그래머스

문제 링크입니다.

https://programmers.co.kr/learn/courses/30/lessons/72410

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

programmers.co.kr

 

String 문자열을 1~7단계에 따라 순차적으로 변환하는 문제입니다.  자바로 진행하였습니다.

각 n단계가 끝날 때마나 temp(n) 변수에 정답을 넣었습니다.  즉 1단계가 끝나면 temp1에, 2단계가 끝나면 temp2에 넣는 식으로...

 

효율적인 방법은 아니지만. temp를 보고 몇 단계를 마친 후인지를 분명하게 알 수 있어 그렇게 했습니다.

 

 

1단계 : 영어 대문자 -> 소문자로 치환

String temp = new_id.toLowerCase(); // 1단계

String toLowerCase() : 대문자를 모두 소문자로 치환할 수 있습니다.

String toUpeerCase() : 반대로 대문자로 변환해주는 함수입니다.

 

 

 

 

 2단계 : 알파벳 소문자, 숫자, '-', '_' , '.' 를 제외한 모든 문자 제거

// 2단계
for(int i = 0; i<temp.length();i++){
    char ch = temp.charAt(i);
    if((ch >= '0' && ch<='9') || (ch >= 'a' && ch<='z') || ch == '-' || ch=='_'|| ch=='.'){
        temp2 += ch;
    }
}

temp.charAt(i) 로 하나씩 문자 ch를 받아옵니다.

이때 생각해야 될 중요한 부분은 알파벳 소문자든, 숫자이던 간에 모두 문자로 인식한다는 점입니다.

따라서 숫자도 ch로 읽어올 때 '0' ~ '9' 로 인식하게 됩니다. 따라서 ch의 범위를 위와 같이 설정할 수 있습니다.

 

 

 

 3단계 :  2개 이상의 마침표를 하나의 마침표로 통일

// 3단계
int idx = 0;
for(int i=0; i<temp2.length();i++){
    if(temp2.charAt(i) == '.') {
        int j = i+1;
        String dot = ".";

        while(j != temp2.length() && temp2.charAt(j) == '.') {
            dot += ".";
            j++;
        }

        if(dot.length() > 1)
            temp2 = temp2.replace(dot, ".");
    }
}temp3 = temp2;

 

String replace(CharSequnce target, CharSequence replacement)

Replace 함수는 자신이 바꾸고싶은 문자로 문자열을 치환시켜주는 기능을 합니다.

 

temp2의 모든 문자를 돌면서 마침표가 2개 이상인 경우, 마침표가 아닌 부분이 나올 때까지 String dot에 그 부분을 저장합니다.

temp2의 dot 부분을 마침표 하나로 바꿉니다.

 

 

 

4단계 : 마침표(.)가 처음이나 끝부분에 있다면 제거합니다.

// 4단계
if(temp3.startsWith(".")){
    temp3 = temp3.substring(1,temp3.length());
}if(temp3.endsWith(".")) {
    temp3 = temp3.substring(0, temp3.length()-1);
}
temp4 = temp3;

temp3에 첫 부분과 끝 부분을 검사해 마침표(.)가 있다면, substring함수로 문자열을 다시 만들어줍니다.

 

substring() 함수가 정의되어 있는 부분을 살펴보면.

String substring(int beginIndex, int endIndex) 

Params:
beginIndex – the beginning index, inclusive.
endIndex – the ending index, exclusive.

 

첫 번째 인자는 포함, 두 번째 인자는 포함하지 않습니다.

그러니 시작하는 인덱스값은 똑같이, 끝부분 인덱스는 의도하는 값 + 1 로 적어주면 되겠습니다.

 

 

 

 5단계 : 빈 문자열이라면, "a" 대입

// 5단계
if(temp4.length() == 0)
    temp5 = "a";
else  temp5 = temp4;

temp4가 비었다면 "a"를 넣어줍니다.

 

 

 

6단계 : 길이가 16자 이상이라면, 앞의 15개만을 남겨두고, 끝에 "."이 있다면 제거합니다.

// 6단계
if(temp5.length() >= 16){
    temp5 = temp5.substring(0,15);
}
if(temp5.endsWith("."))
    temp5 = temp5.substring(0,temp5.length() - 1);
temp6 = temp5;

4단계의 substring 함수를 사용. 

16 이상인 경우 0 ~ 14 까지의 인덱스를 합해 temp5를 갱신하고, 끝에 마침표(.)가 있다면 이 역시 제거해줍니다.

 

 

 

7단계 : 길이가 2 이하라면 길이가 3이 될 때까지 마지막 문자를 뒤에 붙여줍니다.

// 7단계
if(temp6.length() <= 2){
    while(temp6.length()<3){
        temp6 += temp6.charAt(temp6.length()-1);
    }
}temp7 = temp6;

 

 

 

전체 소스코드

public String solution(String new_id) {
    String answer = "";
    String temp = new_id.toLowerCase(); // 1단계

    String temp2="", temp3="", temp4="", temp5="", temp6="", temp7 = "";

    // 2단계
    for(int i = 0; i<temp.length();i++){
        char ch = temp.charAt(i);
        if((ch >= '0' && ch<='9') || (ch >= 'a' && ch<='z') || ch == '-' || ch=='_'|| ch=='.'){
            temp2 += ch;
        }
    }

    // 3단계
    int idx = 0;
    for(int i=0; i<temp2.length();i++){
        if(temp2.charAt(i) == '.') {
            int j = i+1;
            String dot = ".";

            while(j != temp2.length() && temp2.charAt(j) == '.') {
                dot += ".";
                j++;
            }

            if(dot.length() > 1)
                temp2 = temp2.replace(dot, ".");
        }
    }temp3 = temp2;


    // 4단계
    if(temp3.startsWith(".")){
        temp3 = temp3.substring(1,temp3.length());
    }if(temp3.endsWith(".")) {
        temp3 = temp3.substring(0, temp3.length()-1);
    }
    temp4 = temp3;

    // 5단계
    if(temp4.length() == 0)
        temp5 = "a";
    else  temp5 = temp4;


    // 6단계
    if(temp5.length() >= 16){
        temp5 = temp5.substring(0,15);
    }
    if(temp5.endsWith("."))
        temp5 = temp5.substring(0,temp5.length() - 1);
    temp6 = temp5;


    // 7단계
    if(temp6.length() <= 2){
        while(temp6.length()<3){
            temp6 += temp6.charAt(temp6.length()-1);
        }
    }temp7 = temp6;

    return temp7;
}