2 분 소요

prob1

prob2

prob3

prob4

import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Solution 
{
    public String solution(String new_id) 
    {         
	//1단계
    String reg1 = "[A-Z]+";
    
    //StringBuffer new_id1 = new StringBuffer();
    //new_id1.append(new_id);
    
    //위에 2줄이 아래코드 대신
    String new_id1 = new_id;
    
    //페턴 객체에 정규식을 넣어 컴파일 한다.
    Pattern pat = Pattern.compile(reg1);
    
    //패턴 객체의 matcher함수에 인수로 new_id1을 넣고
    //실행한 결과를 Matcher객체에 넣는다.
    Matcher match = pat.matcher(new_id1);
    while(match.find())            
    //match.find()
    //=>match되는 값이 있으면 true, 그렇지 않으면 false를 반환한다.
    //  반복하다보면 언젠가 false가 나온다.    
    {
        int start = match.start();  //일치부분 시작 인덱스
        int end = match.end();     //일치부분 끝의 다음 인덱스

        //예시
        //정규식 = "a*b";

        //인덱스  0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16
        //문자열  a  a  b  f  o  o  a  b  f  o   o   a   a   b   f   o   o 
        //       -------           ----             ---------
        //start의 값들 => 0,6,11
        //end의 값달 => 3,8,14     
        //시작 인덱스, 끝인덱스, 삽입할 문자열
        //소문자로 구성된 새로은 문자열 만들기    
        //match.group() => 매치와 일치하는 문자열을 반환한다.
        new_id1 = new_id1.substring(0, start) + match.group().toLowerCase()
                  +new_id1.substring(end);
            
         //마지막에+new_id1.substring(end, new_id1.length());라 해도 된다.          
         //이때 new_id1.length()-1로 하면 마지막 인덱스를 빼먹으니 주의해야한다.
    }
   
    //2단계
    //알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 
    //마침표(.)를 제외한 모든 문자를 제거.
    //replace안에 정규식 쓸때 "\"를 나타내기 위해선 "\\"로 해야한다.
    //(단 compile안하고 정규식 사용시 상관없다.)
    
    //예시
    //function checkEngNum(str) 
    //{ 
    //  const regExp = /[a-zA-Z0-9]/g; 
    //  if(regExp.test(str))
    //  { 
    //      return true; 
    //  }
    //  else
    //  { 
    //      return false; 
    //  } 
    //}

    /*
    정규 표현식에서 백슬러시(\)는 확장 문자로, 
    다음에 일반 문자가 오면 특수문자로 취급하고, 
    백슬러시 다음에 특수문자가 오면 그 문자 자체를 의미  
    예시) \\- => "-"자체를 의미
    */
    
    new_id1 = new_id1.replaceAll("[^a-z\\d\\-_.]*", "");
    
    //3단계
    //"."가 2개이상 연속되면 하나의 "."로 바꾼다.
    new_id1 = new_id1.replaceAll("\\.{2,}", ".");
        
    //4단계
    //"."으로 시작하거나 끝나는지 판단.
    //"^문자1" => 문자열의 시작이 문자1인것을 의미 
    //"문자2$" => 문자열의 끝이 문자2인것을 의미 
    //new_id1.replace("^(\\.)", "");
    //new_id1.replace("(\\.)$", "");
    new_id1 = new_id1.replaceAll("^[.]|[.]$", "");

    //5단계
    //new_id가 빈 문자열인지 판단하고, 비어있다면 new_id에 "a"를 대입
    //주의!!
    //"=="는 객체가 같은지를 비교하지만 객체가 갖고 있는 문자열을 비교하지는 않는다.
    //즉 객체의 hascode(주소)가 같은것인가 비교하지, 서로 다른 객체의 내용물이
    //같은가 비교하는 것이 아니다. 
    //따라서 객체의 내용물이 같은가 판단하고 싶다면 반드시 equals를 써줘야 한다.
    if(new_id1.equals(""))
    {
        new_id1 = "a";
    }
    
    //6단계
    //new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거.
    //만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거.     
    if(new_id1.length() >= 16)
    {
        //앞의 15개의 문자열 축출
        String new_id2 = new_id1.substring(0,15);

        //new_id1에서 15번째 문자열이 "."가 확인위해 아레처럼 코딩
        
        //같은 문자열끼리 비교해야 한다.!!!!
        //charAt()으로 얻은 값을 넣은 값은 문자열이 아닌 문자다.
        //따라서 문자열인 "."과 비교할 수 가 없다.
        //=> substring()을 통해 문자열을 얻어와 비교해야 한다.
        String comp1 = new_id1.substring(14,15);
        System.out.println(comp1);
        String comp2 = ".";

        //주의!!!!!!!!!                        
        //"=="는 객체가 같은지를 비교하지만 객체가 갖고 있는 문자열을 비교하지는 않는다.
        //즉 객체의 hascode(주소)가 같은것인가 비교하지, 서로 다른 객체의 내용물이
        //같은가 비교하는 것이 아니다. 
        //따라서 객체의 내용물이 같은가 판단하고 싶다면 반드시 equals를 써줘야 한다.
        
        //참고 a.compareTo(b)
        //=>어떤 문자가 사전적인 순서로 앞에 있는지도 리턴
        //  ex) 음수(a가 b보다 앞서있다), 0(a가 b와 같다), 양수(a가 b보다 뒤에 있다.)
        if(comp1.equals(comp2))
        {
            new_id1 = new_id1.substring(0,14);
        } 
        else
        {
            new_id1 = new_id2;
        }
    }
    
    //7단계
    //new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 
    //new_id의 길이가 3이 될 때까지 반복해서 끝에 붙인다.
    if(new_id1.length() <= 2)
    {
        char last = new_id1.charAt(new_id1.length()-1);
        
        //int i=new_id1.length()에서 -1하지 않도록 한다.
        for(int i=new_id1.length(); i<=2; i++)
        {
            new_id1 += last;
        }
    }
    String answer = new_id1;
    return answer;      
	}
}

실행결과

아이디추천 결과

댓글남기기