오늘은 알고리즘 문제중 두번째로 많이 나오는 문자열에대해 공부를 하는데, 신규 아이디 추천 이라는 programmers문제로 문자열에 대해 공부하였다.
https://school.programmers.co.kr/learn/courses/30/lessons/72410#qna
입력받은 아이디에 대해서
1단계 newid의 모든 대문자를 대응되는 소문자로 치환합니다.
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이 될 때까지 반복해서 끝에 붙입니다.
위 7단계를 거쳐 새로운 아이디를 추천해주는 문제이다.
class Solution {
fun solution(new_id: String): String {
var answer = new_id
//소문자로 전환
answer = new_id.replace(Regex("[A-Z]"), {it.value.toLowerCase()})
//특수문자 제거
answer = answer.replace(Regex("[~!@#\$%^&*()=+\\[\\]{}:?,<>/]"), "")
//2개이상 반복하는 . 하나로 바꿈
answer = answer.replace(Regex("\\.{2,}"), ".")
//처음이나 마지막이 .이라면 제거
answer = if(answer.startsWith(".")){
answer.substring(1)
}else{
answer
}
answer = if(answer.endsWith(".")){
answer.substring(0, answer.length-1)
}else{
answer
}
//빈 문자열이라면 a를 대입
if(answer.isEmpty()) answer += "a"
else answer
//16자 이상이면 15문자 제외한 나머지 제거, 제거후 마지막이.이라면 제거
if(answer.length > 15) answer = answer.substring(0, 15)
if(answer.endsWith(".")) answer = answer.substring(0,14)
//길이가 2 이하라면 마지막 문자를 길이가 3이 될때까지 반복
if(answer.length < 3) {
val lastChar = answer.last()
answer += lastChar.toString().repeat(3-answer.length)
}
return answer
}
}
step1부터 하나씩 단계를 거쳐나갔다.
이렇게 모든 과정을 하나씩 거쳐서 풀어줬다.