코테/프로그래머스

[프로그래머스/Level1] 신규 아이디 추천 (JAVA)

imname1am 2024. 2. 21. 14:57
반응형

📖 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

💡  풀이 방식

• 문자열 (정규식)

 

문제에서 언급한 단계대로 진행하면 된다.

 

그 중 정규식을 사용하거나 헷갈렸던 부분에 대해서만 작성해보겠다.

 

 

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

- Character.isLowerCase(char) : 해당 문자열이 소문자인지 확인

- Character.isDigit(char) : 해당 문자열이 숫자인지 확인

 

정규식을 활용하면 좋았겠지만.. 까먹은 관계로 직접 알파벳 소문자, 숫자, -, _, . 에 해당하는 문자열을 추가한 새 문자열을  만들어 복사해 활용했다.

char[] ch = answer.toCharArray();

StringBuilder tmp = new StringBuilder();
for(char c : ch) {
    if(Character.isLowerCase(c))    tmp.append(c);  // 소문자인지 확인
    else if(Character.isDigit(c))   tmp.append(c);  // !!숫자인지 확인
    else if(c == '-' ||  c == '_' || c == '.')   tmp.append(c);
}        
answer = tmp.toString();

 

 

[3단계] 마침표(.) 2개 이상이면 하나로 치환 > 정규식

answer = answer.replaceAll("\\.{2,}", ".");

 

 

 

 

💥 유의사항

- 4단계를 진행할 때 문자열의 길이가 0 이상인지 확인하고 진행해야 한다.

- 6단계 진행 후, 마지막 문자열이 마침표(.)일 경우 제거한다.

 

🔺 코드

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
import java.util.*;
 
class Solution {
    public String solution(String new_id) {
        
        // 1. 소문자로 치환
        String answer = new_id.toLowerCase();
        
        // 2. 알파벳 소문자, 숫자, -, _, . 제외한 모든 문자 제거 > 정규식
        char[] ch = answer.toCharArray();
        
        StringBuilder tmp = new StringBuilder();
        for(char c : ch) {
            if(Character.isLowerCase(c))    tmp.append(c);
            else if(Character.isDigit(c))   tmp.append(c);
            else if(c == '-' ||  c == '_' || c == '.')   tmp.append(c);
        }        
        answer = tmp.toString();
        
        // 3. 마침표(.) 2개 이상이면 하나로 치환
        answer = answer.replaceAll("\\.{2,}"".");
        
        // 4. 마침표(.) 처음이나 끝에 있다면 제거
        if(answer.length() > 0 && answer.charAt(0== '.')
            answer = answer.substring(1);
        if(answer.length() > 0 && answer.charAt(answer.length() - 1== '.')
            answer = answer.substring(0, answer.length() - 1);
        
        // 5. 빈 문자열이면, a 대입
        if(answer.length() == 0)
            answer = "a";
        
        // 6. 길이가 16자 이상이면, 첫 15개 제외하고 모두 제거
        if(answer.length() >= 16)
            answer = answer.substring(015);
        
        if(answer.length() > 0 && answer.charAt(answer.length() - 1== '.') // 마지막 . 제거
            answer = answer.substring(0, answer.length() - 1);
        
        
        // 7. 길이가 2자 이하면, 마지막 문자를 길이가 3이 될 때까지 반복해서 끝에 붙임
        if(answer.length() <= 2) {
            while(answer.length() < 3) {
                answer += answer.charAt(answer.length() - 1);
            }
        }
                
        return answer;
    }
}
cs

 

➕ 다른 풀이 방식

- 정규표현식 ver. (출처)

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
class Solution {
    public String solution(String new_id) {
        String answer = new_id.toLowerCase(); // 1단계
 
        answer = answer.replaceAll("[^-_.a-z0-9]"""); // 2단계
        answer = answer.replaceAll("\\.+"".");     // 3단계
        answer = answer.replaceAll("^[.]|[.]$""");    // 4단계
        
        if (answer.equals("")) {    // 5단계
            answer += "a";
        }
 
        if (answer.length() >= 16) {    // 6단계
            answer = answer.substring(015);
            answer = answer.replaceAll("[.]$","");
        }
 
        if (answer.length() <= 2) {  // 7단계
            while (answer.length() < 3) {
                answer += answer.charAt(answer.length()-1);
            }
        }
 
        return answer;
    }
}
cs

 

 

- 정규표현식 없이 점 2개 이상 처리 (출처)

// 방법1
while (answer.indexOf("..") != -1)
	answer = answer.replace("..", ".");
    
// 방법2
while (new_id.contains(".."))
    new_id = new_id.replace("..", ".");

 

 


💦 어려웠던 점

33분 소요 (구현 23분, 디버깅 10분)

- 정규식을 암기하고 있지 직접 구현했다...

- 문자가 2개 이상일 때 처리! 다음엔 나도 while문을 활용해 어렵지 않게 처리하도록 하겠다!

 

 

🧐 새로 알게 된 내용

- Character.isLowerCase(char) : 해당 문자열이 소문자인지 확인

- Character.isDigit(char) : 해당 문자열이 숫자인지 확인

 

4단계에서 마침표로 시작하거나 끝나는지 확인할 때, startsWith(), endsWith() 써도 되었다,,,

 

1회독 2회독 3회독 4회독 5회독
V 240706      

 

 

(+240706 2회독)

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
import java.util.*;
 
class Solution {
    public String solution(String new_id) {
        
        // step1.
        new_id = new_id.toLowerCase();
        
        // step2.
        StringBuilder sb = new StringBuilder();
        for(char c : new_id.toCharArray()) {
            if(c >= 'a' && c <= 'z')        sb.append(c);
            else if(Character.isDigit(c))   sb.append(c);
            else if(c == '-' || c == '_' || c == '.')   sb.append(c);
        }
        
        // step3.
        String newStr = sb.toString();
        while(newStr.contains("..")) {
            newStr = newStr.replace(".."".");
        }
        
        // step4.
        if(newStr.startsWith("."))
            newStr = newStr.substring(1);
        
        if(newStr.endsWith("."))
            newStr = newStr.substring(0, newStr.length()-1);
        
        // step5.
        if(newStr.length() == 0)
            newStr = "a";
        
        // step6.
        if(newStr.length() >= 16) {
            newStr = newStr.substring(015);
            
            if(newStr.endsWith("."))
                newStr = newStr.substring(0, newStr.length()-1);
        }        
        
        // step7.
        if(newStr.length() <= 2) {
            char c = newStr.charAt(newStr.length() - 1);
            while(newStr.length() < 3) {
                newStr += c;
            }
        }
        return newStr;
    }
}
cs


(참고)

 

[2021 카카오 코딩테스트] 신규 아이디 추천(문자열, String Lv. 1) - java 자바

0. 자세한 설명은 YouTube 영상으로 1. 문제 설명 (출처 : 프로그래머스) 카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하

coding-grandpa.tistory.com

 

반응형