Algorithm/Java

프로그래머스 - 신규 아이디 추천 java :: 2021 KAKAO BLIND RECRUITMENT :: 72410

고고마코드 2022. 7. 8. 12:30
반응형

문제 링크

코딩테스트 연습 - 신규 아이디 추천 | 프로그래머스 스쿨 (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이 될 때까지 반복해서 끝에 붙입니다.

문제 풀이

  • 규칙이 있고 치환, 제거 등의 작업을 할 때에는 정규식을 활용

풀이-1

public String solution(String new_id) {
    // Level 1
    new_id = new_id.toLowerCase(); 

    // Level 2
    new_id = new_id.replaceAll("[^\\w-_.]*", "");

    // Level 3
    new_id = new_id.replaceAll("\\.{2,}", ".");

    // Level 4
    new_id = new_id.replaceAll("^\\.|\\.$", "");

    // Level 5
    if(new_id.equals("")) new_id = "a";

    // Level 6
    if(new_id.length() > 15) new_id = new_id.substring(0, 15).replaceAll("\\.$", "");

    // Level 7
    if(new_id.length() <= 2) {
        char ch = new_id.charAt(new_id.length()-1);
        while(new_id.length() <= 3) {
            new_id += ch;
        }
    }        

    return new_id;
}
  • Level 1 : 모든 대문자를 소문자로 표현
    • String의 toLowerCase() 는 모든 문자를 소문자로 만들어요.

  • Level 2 : 알파벳 소문자, 숫자, -, _, .를 제외한 모든 문자를 제거
    • replaceAll("[^\\w-_.]*", "") replaceAll을 사용하면 정규식을 원하는 문자로 대체할 수 있어요.
      • [^] : []안에 ^가 있으면 not 의 의미입니다. 즉 [^1] 은 1이 아니라면... 을 의미합니다.
      • \\w : 알파벳 소문자, 숫자를 의미합니다. a-z0-9 와 같은 의미입니다.
        [^\\w-_.] 은 알파벳 소문자, 숫자, -, _, . 가 아닌 경우 를 뜻합니다.

  • Level 3 : .가 2번 이상 연속된 경우 하나의 .로 치환
    • \\.{2,}.가 2개 이상 연속되는 경우를 뜻합니다.

  • Level 4 : .가 처음이나 끝에 있으면 제거
    • ^\\.|\\.$ : ^는 괄호[] 안에 있으면 Not의 의미이지만 괄호 밖에 있으면 처음을 의미합니다.
    • $는 마지막을 의미합니다.
    • |는 또는(or)의 의미입니다.
      그러므로 "처음에 마침표(.)가 있거나 마지막에 마침표(.)가 있는 경우"라는 뜻입니다.

  • Level 5 : 빈 문자열이라면 "a"를 대입
    • public boolean equals(Object anObject) : 문자열의 값을 비교
      공백인지 아닌지 비교하여 공백이면 "a"를 대입한다.

  • Level 6 : 길이가 16이상이면 15개의 문자까지만 표현하고 나머지는 제거, 제거 후 마지막 문자가 .이면 마침표도 제거
    • public String substring(int beginIndex, int endIndex)
      • 문자열을 내가 원하는 인덱스만큼 자를 수 있는 메소드
        예를 들어 "abcde"라는 문자열이 있고, substring(0, 3)을 했다면 결과는 "abc"이다.
        주의할 점은 endIndex에 3을 넣는다고 인덱스 3을 포함시키지는 않는다. 3 이전까지라는 뜻이다.
    • \\.$ : Level 4에서도 나온 것을 그대로 응용

  • Level 7 : 문자열의 길이가 2 이하라면 마지막 문자를 길이가 3이 될 때까지 계속 추가
    • 마지막 문자를 구해 길이가 3보다 작으면 문자열에 계속 더한다.

테스트 케이스 처리속도

  • 0.41ms ~ 15.17ms

반응형