- 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()
}
}
'알고리즘 > 문자열' 카테고리의 다른 글
[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 |