늘 겸손하게

Programmers - 2021 KAKAO BLIND RECRUITMENT > 신규 아이디 추천 - Java 본문

코딩 문제/Programmers

Programmers - 2021 KAKAO BLIND RECRUITMENT > 신규 아이디 추천 - Java

besforyou999 2022. 3. 2. 15:35

 

안녕하세요 besforyou 입니다

 

2021 KAKAO BLIND RECRUITMENT > 신규 아이디 추천 문제 해설입니다

 


문제 풀이

 

주어진 단계별로 문자열을 변형하면 되는 문제입니다.

 

1 단계

String의 메소드인 toLowerCase()로 문자열 속 대문자들을 모두 소문자로 바꿉니다.

 

1
2
// Step 1
answer = new_id.toLowerCase();
cs

 

2 단계

순차탐색으로 모든 문자를 읽어들여서 알파벳 소문자, 숫자, 빼기, 밑줄, 마침표를 제외한 모든 문자를 제거합니다.

문자가 숫자인지는 Character.isDigit() 메소드로 알 수 있습니다.

1
2
3
4
5
6
7
8
// Step 2
for (int i = 0 ; i < answer.length() ; i++) {
    Character ch = answer.charAt(i);
    if ( ch == '-' || ch == '_' || ch == '.' ||  Character.isDigit(ch) || isAlpha(ch) )
        temp += ch;
    else
        continue;
}
cs

 

- isAlpha()

1
2
3
4
5
public boolean isAlpha(char c) {
    if ( c >= 'a' && c <= 'z' ) 
return true;
    else
     return false;
}
cs

 

3 단계

마침표가 2번 이상 연속된 부분을 하나의 마침표로 치환합니다.

문자열을 순차 탐색하며 마침표를 찾고, 마침표가 연속되었다면 연속된 마지막 마침표의 인덱스를 i에 저장하여 마지막 마침표 다음 문자부터 정답 문자열에 이어 붙입니다.

 

1
2
// Step 3
answer = mergeDots(answer);
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public String mergeDots(String str) {
        String ans = "";
        StringBuilder string = new StringBuilder(str);
        for (int i = 0 ; i < string.length() ; i++) {
            Character c = string.charAt(i);
            if ( c == '.')  {
                int p = i;
                while ( p != string.length() && string.charAt(p) == '.' ) p += 1;
                i = p - 1;
            }
            ans += c;
        }
        return ans;
    }
cs

 

 

4 단계

문자열의 인덱스를 이용하여 처음이나 마지막에 존재하는 마침표를 제거합니다.

주의점 : 인덱스를 이용하여 문자열에 접근한다면, 마침표를 제거했을때 길이가 0이 되는 경우를 피해야합니다. 

 

1
2
// Step 4
answer = trimDots(answer);
cs
1
2
3
4
5
6
7
public String trimDots(String str) {
    StringBuilder string = new StringBuilder(str);
    if (string.charAt(0== '.' ) string.deleteCharAt(0);
    int len = string.length();
    if (len - 1 > 0 && string.charAt(len - 1== '.' ) string.deleteCharAt(len - 1);
    return string.toString();
}
cs

 

 

5 단계

빈 문자열이라면 문자열 끝에 "a"를 대입합니다.

 

1
2
// Step 5
if (answer.length() == 0) answer = "a";
cs

 

6 단계

문자열 길이가 16자 이상이면 첫 15개의 문자를 제외한 나머지 문자를 모두 제거합니다. String 메소드 substring을 이용합니다.

제거 후 마침표가 문자열 끝에 위치한다면 끝에 위치한 마침표 문자를 제거합니다. 4단계에서 만든 trimDots를 사용합니다.

 

1
2
// Step 6
answer = limitTo15(answer);
cs
1
2
3
4
5
6
public String limitTo15(String str) {
    if (str.length() <= 15return str;
    String ans = str.substring(015);
    ans = trimDots(ans);
    return ans;
}
cs

 

7 단계

인덱스로 문자열을 참조하여 문자열의 길이가 3이 될 때까지 마지막 문자를 문자열에 이어붙힙니다.

 

1
2
// Step 7
if ( answer.length() <= 2 ) answer = stretchString(answer);
cs
1
2
3
4
5
6
public String stretchString(String str) {
    int len = str.length();
    Character c = str.charAt(len - 1);
    while (str.length() != 3 ) str += c;
    return str;
}
cs

 

 


풀 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
class Solution {
    public String solution(String new_id) {
        String answer = "";
        String temp = "";
 
        // Step 1
        answer = new_id.toLowerCase();
 
        // Step 2
        for (int i = 0 ; i < answer.length() ; i++) {
            Character ch = answer.charAt(i);
            if (ch == '-' || ch == '_' || ch == '.' ||  Character.isDigit(ch) || isAlpha(ch) )
                temp += ch;
            else
                continue;
        }
   
        answer = temp;
 
        // Step 3
        answer = mergeDots(answer);
 
        // Step 4
        answer = trimDots(answer);
 
        // Step 5
        if (answer.length() == 0) answer = "a";
 
        // Step 6
        answer = limitTo15(answer);
 
        // Step 7
        if ( answer.length() <= 2 ) answer = stretchString(answer);
        
        return answer;
    }
 
    public boolean isAlpha(char c) {
        if ( c >= 'a' && c <= 'z' ) return true;
        else
            return false;
    }
 
    public String mergeDots(String str) {
        String ans = "";
        StringBuilder string = new StringBuilder(str);
        for (int i = 0 ; i < string.length() ; i++) {
            Character c = string.charAt(i);
            if ( c == '.')  {
                int p = i;
                while ( p != string.length() && string.charAt(p) == '.' ) p += 1;
                i = p - 1;
            }
            ans += c;
        }
        return ans;
    }
 
    public String trimDots(String str) {
        StringBuilder string = new StringBuilder(str);
        if (string.charAt(0== '.' ) string.deleteCharAt(0);
        int len = string.length();
        if (len - 1 > 0 && string.charAt(len - 1== '.' ) string.deleteCharAt(len - 1);
        return string.toString();
    }
 
    public String limitTo15(String str) {
        if (str.length() <= 15return str;
        String ans = str.substring(015);
        ans = trimDots(ans);
        return ans;
    }
 
    public String stretchString(String str) {
        int len = str.length();
        Character c = str.charAt(len - 1);
 
        while (str.length() != 3 ) str += c;
        
        return str;
    }
 
}
cs

 


결과