프로그래머스 - 신규 아이디 추천 (Level 1)

2024. 1. 4. 21:57코딩테스트 정리(자바)

728x90

나의 풀이

import java.util.*;


public class Solution{
    public  String solution(String new_id) {
    
        String answer="";
         //1. 소문자로 치환
        answer=new_id.toLowerCase();
        //2. 소문자, 숫자, 빼기, 밑줄, 마침표 제외 모든 문자 제거
        answer=answer.replaceAll("[^a-z0-9-_.]","");
        //3. 마침표 2번이상 연속되면 하나로
        answer=answer.replaceAll("[.]{2,}",".");
        //4. 마침표가 처음이나 끝에 위치하면 제거
        answer=answer.replaceAll("^[.]|[.]$","");
        //5. 빈 문자열이라면 "a" 대입
        if(answer.length()==0)
            answer+="a";
        //6. 길이가 16자 이상이면 ,15개 이후의 문자들 제거
        if(answer.length()>15){
            int n=0;
            StringBuilder sb=new StringBuilder();
           for(char ch:answer.toCharArray()) {
               if (n == 15)
                   break;
               sb.append(ch);
               n++;
           }
           answer=sb.toString();
           }
        //만약 마침표가 끝에 위치한다면 끝에 위치한 마침표 제거
        answer=answer.replaceAll("[.]$","");
        //만약 길이가 2자 이하라면, 마지막 문자를 길이가 3이 될 때까지 반복해서 이어붙힘
        if(answer.length()<3){
            char[] chr=new char[answer.length()];
            StringBuilder sb=new StringBuilder();
            int i=0;
            for(char ch:answer.toCharArray()){
                chr[i++]=ch;
                sb.append(ch);
            }
            while(sb.length()!=3){
                sb.append(chr[i-1]); //chr[i-1]에는 마지막 문자가 들어가게 됨.
            }
            answer=sb.toString();
        }

        return answer;
    }
}

 

 

1. 정규식 표현

"[^a-z0-9-_.]"

-> 소문자,숫자,빼기,밑줄,마침표 제외

 

이때 "[^a-z 0-9 -_.]"처럼 보기 좋게 공백을 넣었더니 적용이 안됨.

->  공백을 넣지 말아야 함.

 

2. "[.] {2,}"

: 마침표가 2번이상 연속인 경우

 

3. "^[.] | [.]$"

: 마침표가 처음이거나 

마침표가 마지막인 경우 

 

 


 

더 좋은 풀이


public class Solution{
    public  String solution(String new_id) {
        //1. 소문자로 치환
        String answer;
        answer = new_id.toLowerCase();
        //2. 소문자, 숫자, 빼기, 밑줄, 마침표 제외 모든 문자 제거
        answer=answer.replaceAll("[^a-z0-9-_.]","");
        //3. 마침표 2번이상 연속되면 하나로
        answer=answer.replaceAll("[.]{2,}",".");
        //4. 마침표가 처음이나 끝에 위치하면 제거
        answer=answer.replaceAll("^[.]|[.]$","");
        //5. 빈 문자열이라면 "a" 대입
        if(answer.isEmpty())
            answer="a";
        //6. 만약 길이가 16자 이상이면,15개 이후의 문자들 제거
        if(answer.length()>15){
            answer=answer.substring(0,15);
        //마침표가 끝에 위치한다면 끝에 위치한 마침표 제거
        answer=answer.replaceAll("[.]$","");
        }
        //길이가 2자 이하라면, 마지막 문자를 길이가 3이 될 때까지 반복해서 이어붙힘
        while(answer.length()<3) {
            answer+=answer.charAt(answer.length()-1);
        }
        

        return answer;
    }
}

 

 

1. 0~15 인덱스까지의 16자를 잘라냄

answer.substring(0,15);

 

 

2. 2자 이하라면, answer.length()-1 인덱스의 문자를 charAt() 메서드를 사용하여

길이가 3이 될때까지 반복해서 이어 붙임

while(answer.length()<3) {
    answer+=answer.charAt(answer.length()-1);
}

 

 

3. 빈 문자열인지 확인하는 메서드

answer.empty()

 

728x90