알고리즘 CODEKATA 27 (핸드폰 번호 가리기)

오리너구리·2024년 6월 3일
0

CODEKATA

목록 보기
27/57
post-thumbnail

문제 설명

프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.

전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.


제한 조건

  • phone_number는 길이 4 이상, 20이하인 문자열입니다.

내 풀이

최종 풀이

class Solution {
    fun solution(phone_number: String): String {
        var answer = ""
        
        var lastFourLetter = phone_number.takeLast(4)
        
        var firstLetters = phone_number.dropLast(4)
        
       var starNumber = firstLetters.map{it -> "*"}
       
      answer = starNumber.joinToString(separator = "") + lastFourLetter
        
        return answer
    }
}

풀이 과정

class Solution {
    fun solution(phone_number: String): String {
        var answer = ""
        
        var privateNumber = phone_number.replace(Regex("\\d{7}"),"*******")
        
        answer = privateNumber
        
        return answer
    }
}

오 문자열 대체 보자마자 확장함수 공부할 때 Regex 이용해서 문자열 대체 하던게 생각나서

Regex 정리해 놓은 문서 들어가서 작성했는데

코드 테스트 해보니까 전화번호 길이가 다 달랐음…

이럴땐 안배웠는데.? 배운거 활용하겠다 싶어서 신나서 했는데

갑자기 침울해짐

class Solution {
    fun solution(phone_number: String): String {
        var answer = ""
        
        var lastFourLetter = phone_number.takeLast(4)
        
        var firstLetters = phone_number.dropLast(4)
        
       var starNumber = firstLetters.map{it -> "*"}
       
      answer = starNumber.joinToString(separator = "") + lastFourLetter
        
        return answer
    }
}

그래서 그냥 내가 아는 문자열함수 사용해서 풀었음

.takeLast로 lastFourLetter 에 맨 뒤 4글자만 저장해두고,

.dropLast로 firstLetters 에 맨 뒤 4글자 제외한 앞 글자들 저장하고

map으로 firstLetters 의 모든 요소를 “*” 로 변환해줌!

그 다음 answer 에 *로 변환한 문자열 starNumberlastFourLetter 를 합쳐서 넣어줬당

중간에 어려웠던 부분

사실 어려웠다기보다 잠깐 틀린 부분인데

joinToString 함수를 쓸때 separator를 안썼더니 , , * 이런식으로 구분자까지 같이 문자열로 들어와버림 ;; separator 잘 이용하기~!


다른 사람 풀이

class Solution {
    fun solution(phone_number: String): String {
        return "${"".padStart(phone_number.length - 4, '*')}${phone_number.takeLast(4)}"
    }
}

오 padStart를 사용할 수 도 있었나보다

근데 내가 공부한 padStart는 문자열의 길이가 length 길이보다 적으면 앞을 padChar로 변환해주는거라고 알았는데 이게 어떻게 되는거지??????

찾아보니까

빈 문자열에 padStart를 사용하고 phone_number의 length에서 4만큼을 뺀것 보다 길면, *로 치환 해준거였음!!!! 이렇게도 되는 군!

class Solution {
    fun solution(phone_number: String): String {
        val length = phone_number.length
        if (length <= 4) return phone_number
        
        val stars = "*".repeat(length - 4)
        val lastFourDigits = phone_number.takeLast(4)
        
        return stars + lastFourDigits
    }
}

위랑 비슷하게 이렇게 할 수도 있겠당

class Solution {
    fun solution(phone_number: String): String {
        val regex = Regex(".(?=.{4})") // 뒤에서 4자리를 제외한 모든 문자
        return phone_number.replace(regex, "*")
    }
}

만약에 내가 처음 생각한 방식대로 Regex를 이용해서 풀려고 했다면

표현식을 .?=.{4} 이렇게 했어야된다고함!


오늘 알게된 것

  1. 빈 문자열에 padStart를 사용해서 원하는 길이만큼의 숫자를 변환할 수 있다는 것을 알았다.
  2. joinToString 함수에서 구분자를 없애고 싶다면 separator를 사용해야한다는 것을 알았다. (원래 기본으로 구분자가 사라져서 나온다고 생각했음. separator를 내가 따로 추가해야 생기는 건줄!)
profile
오리너구리입니다

0개의 댓글