문자열

quinones·2023년 12월 19일

오늘은 알고리즘 문제중 두번째로 많이 나오는 문자열에대해 공부를 하는데, 신규 아이디 추천 이라는 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부터 하나씩 단계를 거쳐나갔다.

  • 대문자인 부분을 찾아 값을 toLowerCase()를 이용해서 소문자로 바꿔줌
  • 문제에서 허용하는 점(.)빼기(-)밑줄(_)을 제외한 나머지 특수문자를 정규표현식으로 표현해 해당 부분을 빈칸으로 바꿔줌
  • 정규표현식을 이용해 2개이상 반복하는 점을 하나의 점으로 바꿔줌
  • 처음, 마지막이 점이라면 점을 제거(startsWith(), endsWith()사용)
  • 문자열이 비었다면 a를 넣어준다 (isEmpty()사용)
  • 길이가 16이상이라면 처음부터 15개를 제외한 나머지를 지워주고 그후 마지막이 점이라면 제거(substring사용)
  • 길이가 2이하라면 해당 문자열의 마지막 문자를 길이가 3이 될때까지 반복해서 넣어줌(repeat사용)

이렇게 모든 과정을 하나씩 거쳐서 풀어줬다.

profile
이우진

0개의 댓글