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

이한솔·2023년 10월 24일
0

프로그래머스_레벨1

목록 보기
60/65
post-thumbnail

✨️ 문제 설명

: 신규 유저가 입력한 아이디를 나타내는 new_id가 매개변수로 주어질 때, "네오"가 설계한 7단계의 처리 과정을 거친 후의 추천 아이디를 return 하도록 solution 함수를 완성해 주세요.

  -> 자세한 내용 보러가기

🎲 자바 풀이

  • 첫번째 풀이 : 정규식 사용
<class Solution {
    public String solution(String new_id) {
        //정규식을 이용하는 문제?
        //1단계 : 대문자를 소문자로 치환
        new_id = new_id.toLowerCase();
        //2단계 : 알파벳 소문자, 숫자, 하이픈, 언더바, 마침표를 제외한 모든 문자 제거
        new_id = new_id.replaceAll("[^a-z0-9-_.]","");
        //3단계 : new_id 마침표가 2번 이상이면, 연속된 부분을 하나의 마침표
        new_id = new_id.replaceAll("\\.{2,}",".");
        //4단계 : 마침표가 처음이나 끝에 위치하면 제거
        new_id = new_id.replaceAll("^\\.|\\.$", "");
        //5단계 : 빈문자열? -> a 대입
        if(new_id.isEmpty()) new_id = "a";
        //6단계 : 길이가 16글자 이상? -? 첫 15문자를 제외한 나머지 문자 제거
        // -> 마지막이 마침표라면 제거
        if(new_id.length() >= 16) {
            new_id = new_id.substring(0,15);
            new_id = new_id.replaceAll("\\.$","");
        }

        //7단계 : new_id길이가 2자 이하라면 마지막 문자를 붙인다
        while (new_id.length() <= 2) {
            new_id += new_id.charAt(new_id.length() - 1);
        }

        return new_id;
    }
}
  • 두번째 풀이
class Solution {
    public String solution(String new_id) {
        //1단계: 모든 대문자를 대응하는 소문자로 치환
        new_id = new_id.toLowerCase();
        
        StringBuilder sb = new StringBuilder();
        
        //2단계 : 알파벳 소문자, 숫자, 빼기, 밑줄, 마침표를 제외한 모든 문자를 제거
        for(char ch : new_id.toCharArray()){
            if(Character.isLetterOrDigit(ch) || ch == '-' || ch == '_' || ch == '.'){
                sb.append(ch);
            }
        }
        
        //3단계 : 마침표가 2번 이상 -> 하나의 마침표로 변경
        int idx = 0;
        while(idx < sb.length()){
            if(sb.charAt(idx) == '.'){
                //1. 마침표이면 연속해서 마침표인지 확인해야함 -> 마침표 숫자 세기
                int cnt = 1;    //마침표 숫자
                while((idx + cnt) < sb.length() && sb.charAt(idx + cnt) == '.'){
                    cnt++;
                }
                if(cnt > 1){
                    sb.delete(idx + 1, idx + cnt);
                }else{
                    idx++;
                }
            }else{
                idx++;
            }
        }
        
        
        //4단계 : 마침표가 처음이나 끝에 위치하면 제거 -> 길이가 0보다 커야함
        if(sb.length() > 0 && sb.charAt(0) == '.') sb.deleteCharAt(0);
        if(sb.length() > 0 && sb.charAt(sb.length() -1) == '.') 
            sb.deleteCharAt(sb.length() -1);
        
        //5단계 : 빈 문자열이라면 new_id에 'a' 대입
        if(sb.length() == 0) sb.append('a');
        
        //6단계 : 길이가 16자 이상이면 15개 문자로만
        if(sb.length() >= 16) sb.setLength(15);
        //제거후 마지막에 마침표가 위치? -> 제거
        if(sb.charAt(sb.length()-1) == '.') sb.deleteCharAt(sb.length()-1);
        //7단계 : 2글자 미만이면 마지막 문자를 3이 될때까지 반복
        while(sb.length() < 3){
            sb.append(sb.charAt(sb.length() -1));
        }
        
        
        return sb.toString();
    }
}

풀이 설명

: 첫번째로 정규식을 사용하고, 문자열로 연산했을 때, 테스트는 문제 없이 통과했으나 시간이 오래 걸려 문자열을 순회하고, StringBuilder를 사용하였다.
  • 정규식을 이용한 풀이

  • 문자열 순회 및 StringBuilder를 이용한 풀이

profile
개인 공부용

0개의 댓글