신규아이디 추천

DeadWhale·2022년 10월 3일
0

프로그래머스

목록 보기
3/21
post-thumbnail

카카오 블라인드 2021 문제 중 신규 아이디 추천

1단계 newid의 모든 대문자를 대응되는 소문자로 치환합니다.
2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(
), 마침표(.)를 제외한 모든 문자를 제거합니다.
3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.

import java.util.*;
class Solution {
    public String solution(String new_id) {
        // 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
        String answer =  new_id.toLowerCase(); 
        
        // 2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
        String reg_exp ="(?![a-zA-Z0-9-_.]).";
        answer=answer.replaceAll(reg_exp,"");
        
        // 3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
        //replace는 정규식을 사용못한다 ALL과의 차이점은 그것
        answer=answer.replaceAll("[.]{2,}","."); 
        
        // 4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
        int length = answer.length()-1;
        while(true){
            length = answer.length()-1;
            if(length<1) {
                if(answer.equals(".")) answer="";
                break;
            }
            char first = answer.charAt(0);
            char last = answer.charAt(length);
            if(first=='.')         answer=answer.substring(1,length);           
            if(last=='.')          answer=answer.substring(0,length);  
            if(first!='.'||last!='.') break;
        }
 
        
        // 5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
        if(answer.length()==0)answer="a";
        
        // 6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
        if(answer.length()>=16){
          answer=answer.substring(0,15);  
            // 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
            while(answer.charAt(answer.length()-1)=='.')answer=answer.substring(0,answer.length()-1);
        } 
        
        
        // 7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
         if(answer.length()<=2){
            String temp = String.valueOf(answer.charAt(answer.length()-1));
             while(answer.length()<3) answer+=temp;
        } 
        return answer;
    }
}

처음 작성한 코드

정확성이 50프로가 나왔다.

테스트 3 〉 실패 (런타임 에러)
테스트 4 〉 실패 (런타임 에러)
테스트 5 〉 실패 (런타임 에러)
테스트 8 〉 실패 (2.00ms, 74MB)
테스트 11 〉 실패 (런타임 에러)
테스트 12 〉 실패 (런타임 에러)
테스트 13 〉 실패 (2.75ms, 75.9MB)
테스트 15 〉 실패 (런타임 에러)
테스트 19 〉 실패 (런타임 에러)
테스트 20 〉 실패 (런타임 에러)
테스트 21 〉 실패 (런타임 에러)
테스트 25 〉 실패 (1.54ms, 75.1MB)
테스트 26 〉 실패 (2.13ms, 77.5MB)


"a.$.a" => "a.a"
".................................." => "aaa"
위 두개의 테스트 케이스도 통과했다.
런타임 에러도 뜬거보면 -1이 잘못된건가?


정규식을 수정해봤다.

 String reg_exp ="(?![a-zA-Z0-9-_.]).";
 => String reg_exp ="(?![a-z0-9]|[-_]|\\.).";

이스케이프 문제일까 싶었지만 원래도 .이 색출이 됬어가지고 잘 모르겟다.


substring에 첫글자를 제거하는 부분을 수정했다.

if(first=='.')         answer=answer.substring(1);           

성공 했다.

import java.util.*;
class Solution {
    public String solution(String new_id) {
        String answer =  new_id.toLowerCase(); 
        String reg_exp ="(?![a-z0-9]|[-_]|\\.).";
        answer=answer.replaceAll(reg_exp,"");
        answer=answer.replaceAll("[.]{2,}","."); 
        while(true){
          int length = answer.length()-1;
            if(length<1) {
                if(answer.equals(".")) answer="";
                break;
            }
            char first = answer.charAt(0);
            char last = answer.charAt(length);
            if(first=='.')         answer=answer.substring(1);           
            if(last=='.')          answer=answer.substring(0,length);  
            if(first!='.'||last!='.') break;
        }
        if(answer.length()==0)answer="a";
        if(answer.length()>=16){
          answer=answer.substring(0,15);  
            while(answer.charAt(answer.length()-1)=='.')answer=answer.substring(0,answer.length()-1);
        } 
         if(answer.length()<=2){
            String temp = String.valueOf(answer.charAt(answer.length()-1));
             while(answer.length()<3) answer+=temp;
        } 
        return answer;
    }
}

완성된 코드

모두 내 실력으로 했다고 보기에는 애매하다.
정규식 같은 경우 테스트 사이트에서 계속 테스트하며 작성한 것이라.
문자열을 다루는 걸 연습했다고 봐야겟다.

0개의 댓글