관리 메뉴

JumpUp

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

알고리즘

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

yeunnnn 2021. 4. 5. 20:05

[신규 아이디 추천] 문제는 "정규 표현식"을 알면 쉽게 해결할 수 있는 문제였다. 정규 표현식의 문법을 봐도 이해하기 어려워 보여,,,제대로 알고 넘어가지 않았었는데 이번 문제를 통해 기본적인 문법의 감을 익힐 수 도 있었고 정규 표현식을 활용해 문자열 처리를 쉽게 할 수 있는 방법을 알게되었다.

 

정규 표현식의 문법

nesoy.github.io/articles/2018-06/Java-RegExp

 

Java 정규식 표현(Regular Expression)에 대해

 

nesoy.github.io

 

 

[신규 아이디 추천] 풀이 코드

public class 신규아이디추천 {
    public static void main(String[] args) {
        String name = "...!@BaT#*..y.abcdefghijklm";
        System.out.println(solution(name));
    }
    public static String solution(String new_id) {
        new_id = new_id.toLowerCase(); //1단계 - 소문자
        new_id = new_id.replaceAll("[^a-z0-9_.-]",""); //2단계 - 소문자, 일부 특수기호만 사용 가능
        new_id = new_id.replaceAll("[.]{2,}","."); //3단계 - . 2번이상 반복 불가
        new_id = new_id.replaceAll("^[.]|[.]$",""); //4단계 . 처음이나 끝에 위치하면 제거

        if(new_id.isEmpty()) new_id = "a"; //5단계 - 빈 문자열이라면, a를 대입
        if(new_id.length() > 15){  //6단계 - 16자이상이라면, 첫 15개의 문자를 제외한 나머지 문자들 제거. 만약, 제거후 마지막 문자가 마침표(.) 이라면 마침표 제거
            new_id = new_id.substring(0,15);
            new_id = new_id.replaceAll("[.]$","");
        }
        if(new_id.length() < 3){ //7단계 - 2자 이하라면, 마지막 문자를 문자열 길이가 3일 될때까지 반복해서 끝에 붙인다
            char lastChar = new_id.charAt(new_id.length()-1);
            while(new_id.length() != 3) {
                new_id += lastChar;
            }
        }
        return new_id;
    }
}

 

2단계 정규표현식 해석

[^a-z0-9_.-] 

소문자, 숫자, 특수문자 언더바(_) 마침표(.) 하이픈(-)을 제외한 문자

[abc] - abc문자 조합 중 하나
[^abc] - abc문자 조합을 제외한 문자

 

3단계 정규표현식 해석

[.]{2, }

마침표가 2번 이상 반복된다

 

4단계 정규표현식 해석

^[.] | [.]$

문자열의 시작이 마침표(.) 이거나 문자열 끝이 마침표(.) 인 경우를 의미

 

(+)

replaceAll(정규표현식, 대체문자) - 정규표현식 패턴에 일치하는 모든 문자를 대체문자로 대체한다.

replaceFirst(정규표현식, 대체문자) - 정규표현식 패턴에 일치하는 첫 문자만을 대체문자로 대체한다.

replace(char oldChar, char newChar) - 예전 문자를 새로운 문자로 대체해준다.

 

 

 

 

 

728x90