본문으로 바로가기
반응형

 

관련글

 

없음 - 문자열 및 정규 표현식 글 포스팅 후 업데이트 예정

 

1. 개요

 

문제의 링크는 여기를 참조

 

문제의 내용은 아래의 더보기를 클릭하여 참조

 

문자열을 다듬어 적절한 상태의 새로운 문자열로 치환하여 반환하는 문제

 

 

2. 풀이

 

여러 코딩 테스트를 시험 치면 알겠지만, 이러한 문자열 조작에 관한 문제가 많이 나온다.

실제로 완전 탐색 / BFS / DFS 등 여러 기법에 대해서 많이 알더라도 의외로 문자열 조작에 대해 약한 경우가 많다. 실제로 필자도 그러하여 최근 관련 문법에 대해 공부하고 있는 중..

 

이 문제는 다음과 같은 규칙을 갖는다.

① 대문자는 소문자로 바꾼다.
② 숫자 / 문자 / 빼기(-) / 밑줄(_) / 마침표(.) 제외하고는 사용할 수 없다.
③ 마침표가 처음 혹은 끝에 나오면 제거한다.
④ 마침표가 연속 두개 이어지면 하나로 만든다. (.. → .)
⑤ 빈 문자열이면 "a"를 뒤에 붙인다.
⑥ 문자열 길이가 3보다 작으면 가장 뒤의 문자를 길이 3이 될 때까지 추가한다.
⑦ 문자열 길이가 15보다 크면 앞에서부터 15글자만 자른다.

 

여기서 ①은 간단한 method 하나로 해결이 가능하다. Java의 String에는 toLowerCase()가 제공되므로 그것을 사용한다.

②, ③, ④는 정규 표현식으로 해결할 수 있다. 정규 표현식에 관련된 좋은 포스팅은 여기를 참조

⑤, ⑥, ⑦ 문자열 길이 기반으로 조절하는 부분이므로 쉽게 해결이 가능하다.

 

코드를 통해 알아보자.

 

 

3. 코드

 

아래의 코드를 통해 정답을 알아보자.

class Solution {
    public static String solution(String new_id) {
        String s = new_id.toLowerCase();
        s = s.replaceAll("[^-_.a-z0-9]", ""); // 소문자, 숫자, 빼기, 밑줄, 마침표 제외하고 없앤다.
        s = s.replaceAll("[.]{2,}", "."); // 마침표 2개 이상 시 하나로
        s = s.replaceAll("^[.]|[.]$", ""); // 마침표로 시작하거나 끝나면 제거한다.

        int len = s.length();
        
        // 길이가 0이면 "a"로 초기화
        if(len == 0){
            s = "a";
        }

        // 길이가 3보다 작으면 3글자 될 때까지 뒤의 문자를 붙인다.
        if(len < 3){
            while(s.length() < 3){
                s += s.substring(s.length()-1);
            }
        // 길이가 15이상이면 0~14번째 문자까지 자르고, 끝에 마침표 있으면 다 자른다.
        } else if(len > 15){
            s = s.substring(0, 15);
            s = s.replaceAll("^[.]|[.]$", "");
        }

        return s;
    }
}

 

 

 

읽어주셔서 감사합니다. 오류가 있으면 지적해주시면 반영하겠습니다.

반응형