본문 바로가기

알고리즘/문자열

[KOTLIN] 신규 아이디 추천

728x90

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

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

programmers.co.kr

풀이

- 문자열을 다루는 문제이다.

- 1단계는 Kotlin String 클래스에서 제공하는 함수를 이용하여 소문자로 변경 한다.

- 2단계는 입력된 문자열을 검색하여 입력 불가한 글자가 들어 왔는 지 확인 후 제거 한다. 이때 String 클래스에서 제공하는 함수를 알고 있으면 더 편하다.(문자열이 숫자 인지 확인 : isDigit(), 소문자인지 확인 : isLowerCase())

함수를 몰라도 charater 비교로 쉽게 조건문을 만들 수 있다.

- 3단계는 연속된 점을 확인하여 문자열을 새로 만든다. 이때 정규식을 이용하면 한 줄로 간단하게 해결 가능하다. (replace(Regex("[.]+"), "."))

- 4단계는 입력된 문자열의 처음과 끝 문자가 마침표인지 확인하고 제거 한다. 제거 시 String 클래스에서 제공하는 함수를 사용 가능하다. (문자의 첫 번째 혹은 마지막 글자가 조건과 같을 때 제거 : removePrefix(ch: CharSequence), removeSuffix(ch: CharSequence))

- 5단계 입력된 문자열이 비었는 지 확인 한다.

- 6단계 15자 이상일 경우 substring 함수로 문자열을 자른다. 이때 자르고 난 후 마지막 문자가 마침표 일 수도 있으므로 4단계 과정을 수행해서 최종 결과를 반환한다.

- 7단계 길이가 2 이하일 경우 마지막 문자열을 3자리가 될 때까지 문자열에 붙힌다.

코드

class Solution {
    fun solution(new_id: String): String {
        var answer: String = new_id
        answer = doStep1(answer)
        answer = doStep2(answer)
        answer = doStep3(answer)
        answer = doStep4(answer)
        answer = doStep5(answer)
        answer = doStep6(answer)
        answer = doStep7(answer)
        return answer
    }

    // 1단계 : 대문자가 있으면 모두 소문자로 바꾼다.
    private fun doStep1(input: String): String {
        return input.toLowerCase()
    }

    // 2단계 : 입력 불가능한 문자를 제거 한다.
    private fun doStep2(input: String): String {
        val sb = StringBuilder()

        input.forEach { ch ->
            if (ch.isDigit() || ch.isLowerCase() || ch == '-' || ch == '_' || ch == '.') {
                sb.append(ch)
            } else {
                sb.append("")
            }
            
            /*if (ch in '0'..'9' || ch in 'a'..'z' || ch == '-' || ch == '_' || ch == '.') {
                sb.append(ch)
            } else {
                sb.append("")
            }*/
        }

        return sb.toString()
    }

    // 3단계 : 마침표가 연속 두번이상이면 하나로 치환한다.
    private fun doStep3(input: String): String {
        return input.replace(Regex("[.]+"), ".")
        /*val sb = StringBuilder()
        var dotStr = ""

        for (ch in input) {
            if (ch == '.') {
                if (dotStr.isEmpty()) {
                    dotStr = "."
                    sb.append(dotStr)
                }
            } else {
                dotStr = ""
                sb.append(ch)
            }
        }

        return sb.toString()*/
    }

    // 4단계 : 처음과 마지막의 마침표는 제거 한다.
    private fun doStep4(input: String): String {
        return input.removePrefix(".").removeSuffix(".")
        /*return when {
            input[0] == '.' -> input.substring(1)
            input[input.length - 1] == '.' -> input.substring(0, input.length - 1)
            else -> input
        }*/
    }

    // 5단계 : 빈문자열이면 a 를 대입한다.
    private fun doStep5(input: String): String {
        return if (input.isNullOrEmpty()) "a" else input
    }

    // 6단계 : 16자 이상이면 15자까지만 사용한다.
    private fun doStep6(input: String): String {
        val result = if (input.length > 15) {
            input.substring(0 until 15)
        } else {
            input
        }
        
        return result.removeSuffix(".")
    }

    // 7단계 : 길이가 2자 이하이면 마지막 글자를 붙혀서 3자리로 만든다.
    private fun doStep7(input: String): String {
        val sb = StringBuilder()
        val lastCh = input[input.length - 1]
        sb.append(input)

        if (input.length < 3) {
            for (i in 0 until (3 - input.length)) {
                sb.append(lastCh)
            }
        }

        return sb.toString()
    }
}
728x90

'알고리즘 > 문자열' 카테고리의 다른 글

[KOTLIN] 괄호 변환  (0) 2022.02.21
[KOTLIN] 문자열 압축  (0) 2022.02.14
[KOTLIN] 2016년  (0) 2022.02.11
[KOTLIN] 3진법 뒤집기  (0) 2022.02.11
[KOTLIN] 키패드 누르기  (0) 2022.02.07