본문 바로가기

Java/프로그래머스

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

https://school.programmers.co.kr/learn/courses/30/lessons/72410

 

프로그래머스

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

programmers.co.kr

 

 

1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
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이 될 때까지 반복해서 끝에 붙입니다.

 

 

 

 

 

정규 표현식(regex)

https://codechacha.com/ko/java-regex/

 

Java - 정규표현식(regex), 다양한 예제로 쉽게 이해하기

정규표현식(Regular expressions), Regex는 문자열에서 어떤 패턴을 찾는데 도움을 줍니다. Regex의 Metacharacters, Quantifiers, Grouping에 대해서 정리하였고 다양한 예제로 설명합니다. Regex는 대부분 알고 있지

codechacha.com

-  Regex는 문자열에 어떤 패턴의 문자들이 있는지 찾는데 도움을 준다. 

 

Regula Expression Description
. 어떤 문자 1개를 의미
^regex ^ 다음 regex로 line을 시작하는지
regex$ $ 앞의 regex가 line의 마지막으로 끝나는지
[abc] a, b, c 중의 문자 1개
[abc][vz] a, b, c 중에 문자 1개와 v, z 중에 문자 1개의 조합
[^abc] a, b, c를 제외한 문자 1개
[a-d1-7] ad, 17 사이의 문자 1개
X|Z X 또는 Z
\d 0~9 사이의 숫자, [0-9]와 동일
\D 숫자가 아닌 어떤 문자, [^0-9]와 동일
\s whitespace 1개, [\t\n\x0b\r\f]와 동일
\S whitespace를 제외한 문자
\w Alphanumeric(alphabet, 숫자) 문자, [a-zA-Z_0-9]와 동일
\W Alphanumeric을 제외한 문자(whitespace 등)
\S+ whitespace를 제외한 여러 문자
\b 단어의 경계(공백)를 찾습니다

 

 

Quantifiers

- 요소들을 얼마나 반복시킬지 정의 

 

Regular Expression Description
* 0회 이상 반복
+ 1회 이상 반복
? 0 또는 1회만
{X} X회 이상 반복
{X,Y} X~Y 사이의 수만큼 반복
*? 가장 적게 일치하는 패턴을 찾음

 

 

자바 문자열 조작함수 

[Java] 문자열(String) 조작 함수 이해하기 : 조작 및 비교 함수 — Contributor9 (tistory.com)

 

[Java] 문자열(String) 조작 함수 이해하기 : 조작 및 비교 함수

해당 글의 목적은 주요 문자열 조작함수를 이해하고 예제를 통한 이해를 돕기 위해 작성한 글입니다. 해당 글에서는 모든 함수에 대해서는 포함하고 있지 않으며 자주 사용되는 함수 위주로 작

adjh54.tistory.com

 

 

startsWith 

- 문자열 내에 접두사로 해당 문자열이 있는지 확인하는 함수 

 

endsWith

- 문자열 내에 접미사로 해당 문자열이 있는지 확인하는 함수 

 

 

시도 1)

 

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

        
        return new_id;
    }
}

 

 

 

반례
입력값 〉 ".ab......cd."
기댓값 〉 "ab.cd"

 

 

시도 2)

 

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

        
        return new_id;
    }
}

 

테스트 케이스 3 틀림

 

 

정답 

 

class Solution {
    public String solution(String new_id) {
        //1단계 소문자로 치환
        new_id = new_id.toLowerCase();
        
        //2단계 소문자, 숫자, 빼기, 밑줄, 마침표를 제외한 모든 문자 제거
        new_id = new_id.replaceAll("[^a-z0-9._-]", "");
        
        //3단계 마침표가 2번이상 연속된 부분을 하나의 마침표로 치환 
        new_id = new_id.replaceAll("\\.{2,}","."); 
        
       //4단계 마침표가 처음이나 끝에 위치한다면 제거 
        if (!new_id.isEmpty() && new_id.charAt(0) == '.') {
            new_id = new_id.substring(1);
        }
        if (!new_id.isEmpty() && new_id.charAt(new_id.length() - 1) == '.') {
            new_id = new_id.substring(0, new_id.length() - 1);
        }
        
       //5단계 빈 문자열이라면, new_id에 "a"를 대입 
       if(new_id.equals(""))
       {
           new_id+="a";
       }
       else
       {
           new_id = new_id;
       }
        
       //6단계 길이가 16자 이상이라면, new_id의 첫 15개의 문자를 제외한
       //나머지 문자들을 모두 제거
       // 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거
       if(new_id.length()>=16)
       {
           new_id = new_id.substring(0,15);
           
            //제거 했는데 마지막 문자가 .이라면 
           if(new_id.endsWith("."))
           {
               new_id = new_id.substring(0, new_id.length() - 1);
           }
       }
        
       //7단계 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙임 
        if(new_id.length()<=2)
        {
            char ch = new_id.charAt(new_id.length()-1);
            
            while(new_id.length()<3)
            {
                new_id+=String.valueOf(ch);
            }
        }
        
        if(new_id.endsWith("."))
        {
              new_id = new_id.substring(0, new_id.length() - 1);
        }

        
        return new_id;
    }
}

 

 

- substring 사용시 인덱스 범위를 벗어나면 에러가 나므로 문자열이 비어있지 않은지 미리 체크해줘야 함