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

Minsuk Jang·2021년 9월 4일
0

프로그래머스

목록 보기
42/48
post-thumbnail

문제 링크

🤔 문제 해결

아이디를 변환하는데 문제에서 요구하는 7단계 절차는 아래와 같다.

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단계는 toLowerCase()
2단계는 filter를 이용해서 소문자, 숫자, '.', '-', '_' 를 필터링
3단계는 replaceAll()
  - Kotlin extension을 이용해서 String.replaceAll()를 만들어서 진행
4단계는 removePrefix()
5단계는 removeSuffix()
6단계 ~ 7단계는 조건에 맞춰서 분기 처리

💡 다른 사람 풀이

replace 메소드에 정규 표현식 ([.]*[.]) 를 이용

👉 소스 코드

class Solution {
     fun solution(new_id: String): String {
        var temp = new_id.toLowerCase()
            .filter {
                it in 'a' .. 'z' || it in '0' .. '9' || it == '-' || it == '_' || it == '.'
            }
            .replace("[.]*[.]".toRegex(),".")
            //.replaceAll()
            .removePrefix(".")
            .removeSuffix(".")


        if(temp.isEmpty())
            temp = "a"

        if(temp.length >= 16){
            temp = temp.substring(0,15).removeSuffix(".")
        }

        if(temp.length <= 2)
            temp = temp.padEnd(3,temp.last())

        return temp
    }

    private fun String.replaceAll() : String{
        var ret = this
        while(ret.indexOf("..") != -1)
            ret = ret.replace("..",".")

        return ret
    }
}
profile
Positive Thinking

0개의 댓글