TIL/알고리즘

02/02 알고리즘 공부(27) - 핸드폰 번호 가리기

sos000303 2024. 2. 2. 16:37
728x90

조건 : 프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

 

알고리즘 예상

 

1. phone_number의 각 element에 대해 가장 뒤 4글자를 제외하고 *로 바꾼다.

2. answer에 2번을 String형으로 저장한다.

 

초기코드

 

class Solution {
    fun solution(phone_number: String): String {
        var answer = ""
        return answer
    }
}

 

내 코드

class Solution {
    fun solution(phone_number: String): String {
        var answer = ""
        phone_number.forEachIndexed{idx, c -> if(phone_number.length - idx > 4) answer+="*" else answer+=c }
        return answer
    }
}

 

다른 사람의 풀이

class Solution {
    fun solution(phone_number: String): String {
        return "${"".padStart(phone_number.length - 4, '*')}${phone_number.takeLast(4)}"
    }
}
class Solution {
    fun solution(n: String) = "*".repeat(n.length-4) + n.slice(n.length -4 until  n.length)
}

개선점 및 배운점

 

1. 아직 코드 블럭 없는 조건문 사용을 잘 못하겠다. .foldIndexed()를 사용했어도 됐을까?

2. .padStart(얼마나,무엇을), .takeLast(얼마나) .slice(범위) . repeat(얼마나) 등 처음 본 함수들이 많다. 이름에서 어떤 기능인지는 유추할 수 있고 찾아보았더니 대충 비슷했다.

 

개선한 코드

class Solution {
    fun solution(phone_number: String) = phone_number.foldIndexed(""){idx, acc, c -> acc + if(phone_number.length - idx > 4)"*" else c }
}

 

.foldIndexed를 사용해도 정상적으로 코드가 작동했다. 코드를 바꾸니 처리속도가 12~17ms 에서 2~4ms로 줄었다.

728x90